python实现半色调技术图像转换
半色调技术
半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。
比如说,在一块只能显示纯黑或纯白的屏幕上,如何将一张灰度图显示出灰度的效果,这时就可以用半色调技术实现。
如下,左边是一张灰度图,中间是使用半色调技术转换后输出的图像,右边是输出图像的局部放大
初始灰度图 | 半色调转换后的输出图像 | 输出图像局部放大(使用win10自带【画图】软件打开放大) |
---|---|---|
![]() |
![]() |
![]() |
原理
基本原理
我们都知道,一个像素点有0~255共256种灰度值,值越大图像越“白”,反之越“黑”。
对于一些屏幕,只能显示0或1(用1表示255)两种灰度值,也就是只能显示纯黑或纯白,这怎么办?
半色调技术实际是把一个像素点用一个矩阵块来表示,如果像素值比较大(越白),那么矩阵快白色部分就越多,如图所示:
这个矩阵就是bayer矩阵,矩阵边长可以选择1,2,4,8,16,上图矩阵边长是2
如果是16,那么就可以表示16*16=256种灰度值了
如上图所示,对于边长为2的bayer矩阵,假如只有4种颜色值(0,1,2,3),如果像素值比0大,那么就把bayer矩阵的位置0设置为白色;如果比1大,就把位置0和1都设置为白色……
但实际上,灰度值有256种,因此bayer矩阵需要乘以(256/(2*2)),如下
如果像素值比128大,那么0,64,128这3个位置都设置为白色
可以看出,假设输入图像边长为a,bayer矩阵边长为k,则输出图像的边长为a*k,即是输入图像的k倍
bayer矩阵生成
注意:整数*矩阵即矩阵的数乘运算,相当于矩阵每个元素都乘以一个整数
根据这个公式,可以写出一个代码:
def getStandardMat(k):'''函数作用:获取bayer矩阵return:是否生成成功,成功的话同时返回numpy类型的矩阵k: 是bayer矩阵的阶数,取值一般为1 2 4 8 16'''if k & (k-1) != 0:return False, Noneif k == 1:return True, [[0.5]]m = [[0, 2], [3, 1]]m = np.array(m)while(m.shape[0] != k):m1 = np.zeros((m.shape[0]*2, m.shape[1]*2))m1[:m.shape[0], :m.shape[1]] += 4*mm1[:m.shape[0], m.shape[1]:] += 4*m+2m1[m.shape[0]:, :m.shape[1]] += 4*m+3m1[m.shape[0]:, m.shape[1]:] += 4*m+1m = m1return True, m
测试一下:
![]() |
![]() |
![]() |
---|
实践操作
该程序实现读取一张RGB图片,转为灰度图后再采用变色调技术转换图片
使用该程序只需要修改输入图片路径以及输出图片路径即可
# 该文件实现半色调技术的代码import cv2
import numpy as npdef getBayerMat(k):'''函数作用:获取bayer矩阵return:是否生成成功,成功的话同时返回numpy类型的矩阵k: 是bayer矩阵的阶数,取值一般为1 2 4 8 16'''if k & (k-1) != 0:return False, Noneif k == 1:return True, np.array([[0.5]])m = [[0, 2], [3, 1]]m = np.array(m)while(m.shape[0] != k):m1 = np.zeros((m.shape[0]*2, m.shape[1]*2))m1[:m.shape[0], :m.shape[1]] += 4*mm1[:m.shape[0], m.shape[1]:] += 4*m+2m1[m.shape[0]:, :m.shape[1]] += 4*m+3m1[m.shape[0]:, m.shape[1]:] += 4*m+1m = m1return True, mdef convertImg(img, k=4, f=False, useGray=False):'''k:bayer矩阵大小f:由于转换后图像尺寸会变大k倍,f表示是否先缩小k倍useGray:传入的img是否为灰度图'''if not useGray:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)if f:img = cv2.resize(img, dsize=None, fx=1/k, fy=1/k)ret, bayers = getBayerMat(k)if not ret:print(f"矩阵阶数k={k}非2的倍数")returnbayers *= (256//(k*k))h, w = img.shapenewImg = np.zeros((k*h, k*w), dtype='uint8')# 遍历图像每个像素点for i in range(0, h, 1):for j in range(0, w, 1):# 对于每个像素点,遍历bayer矩阵,判断是否该把矩阵中某一位置设置为纯白(255)或纯黑(0)for p in range(k): for q in range(k):if img[i][j] > bayers[p][q]:newImg[k*(i)+p][k*(j)+q] = 255else:newImg[k*(i)+p][k*(j)+q] = 0return newImgif __name__ == '__main__':imgPath = r'D:\Users\xxx\Desktop\imgs\1-1.jpg'img = cv2.imread(imgPath, 0) # 读取图片并转为灰度图nimg = convertImg(img, k=4, f=False, useGray=True)cv2.imwrite("../out/b2.png", nimg) # 输出转换后的图片
使用pyqt5做一个GUI操作界面
▶代码下载
需要安装的库
PyQt5 5.15.0
opencv-python 4.3.0.36
numpy 1.19.0
使用方法:
运行src/main.py文件即可
> python main.py
python实现半色调技术图像转换相关推荐
- 02 数字图像技术——颜色空间转换与颜色空间分割实验结果与分析——python
04 数字图像技术--图像特征提取之实验结果与分析 03 数字图像技术--频域滤波实验结果与分析 02 数字图像技术--颜色空间转换与颜色空间分割实验结果与分析 01 数字图像基本操作--图像采样.量 ...
- 实验1-基于半色调技术的图像打印程序
1.摘要 本实验采用半色调技术对图像进行打印和显示,对于256灰度级的图像,用二值像素进行描述,降低了对灰度级别的需求.首先,读入需要打印的图像,改变他的尺寸,使其半色调变换后能够适应A4纸张的大小: ...
- 豹变猫?实时场景转变?NVIDIA多模式图像转换技术都能实现
内容来源:ATYUN AI平台 改变美洲豹身上的斑点似乎是个很有趣的想法,而这个想法也并非天方夜谭.通过NVIDIA新的加速GPU深度学习技术,无论是图片还是视频,甚至是实体美洲豹,都能使其变成猫.老 ...
- 使用Python和OpenCV在图像之间执行超快速的颜色转换
使用Python和OpenCV在图像之间执行超快速的颜色转换 1. 效果图 2. 原理 2.1 颜色转移算法 2.2 步骤 2.3 算法改进 3. 源码 参考 这篇博客将介绍如何使用Python和Op ...
- 使用Python,OpenCV进行图像平移转换
使用Python,OpenCV进行图像平移转换 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何使用Python,OpenCV对图像进行平移转换.平移是图像沿x轴和y轴的移动.使用平移, ...
- 【图像处理】基于半色调技术的图像打印程序(Image Printing Program Based on Halftoning)
实验要求 本实验后面的图像给出了用点模式近似表示的10 个灰度级.每一个灰度级用一个3 x 3 的黑白点模式表示.用黑点全部填充的3 x 3 区域近似表示灰度级为0 的黑色灰度级,全部填充白点的3 ...
- 基于对抗生成网络的图像转换技术【论文笔记】
前两篇文章是对方法的改进,详细地论证了提出的方法的可行性和优越性.后两篇是应用型,针对一个特定的问题提出方法. Image-to-Image Translation with Conditional ...
- Python 如何把图像转换成video (avi)格式?
Python 如何把图像转换成video (avi)格式? import cv2 def image_to_video(image_dir, save_dir, size: tuple, fps=10 ...
- 译:ROS和Openv之间的图像转换(Python)
描述:本教程介绍如何使用cv_bridge将ROS图像转换为OpenCV图像,反之亦然,从而实现ROS和OpenCV的交互. 包括一个示例节点,可用作您自己节点的模板. 1.概念 ROS以其自己的se ...
最新文章
- 手把手教你搭建 ELK 实时日志分析平台
- java 行为模式_java设计模式--行为模式
- windows 报错 没有文件扩展.vbs的脚本引擎 解决方法
- 网络规划设计(项目类业务)
- Webpack基础之加载器
- jQuery属性筛选选择器
- 为什么你的年薪只是别人的月薪?你需要技术专家帮你「充电」
- 亚马逊招聘,无人超市研发部门
- ( 转)Hibernate常用API
- JavaScript:屏蔽浏览器右键点击事件
- iMX8 Android SDK 下载
- GitHub 上有哪些优秀的 Python 爬虫项目?
- python使用opencv进行身份证信息识别_基于opencv和tesseract实现身份证扫描件的身份证号码提取试验...
- 服务器怎么与plc通讯协议,PLC如何与云服务器通讯
- 像智能手机一样造车,可能吗?
- 深度学习中如何选择一款合适的GPU卡的一些经验和建议分享
- 勾股数规律(任意三个数能够满足勾股定理需要满足的条件)
- PO模式项目实战思路分析
- 机器学习(线性回归实训)------波士顿房价
- 【BZOJ 3470】3470: Freda’s Walk 期望