半色调技术

半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。

比如说,在一块只能显示纯黑或纯白的屏幕上,如何将一张灰度图显示出灰度的效果,这时就可以用半色调技术实现。

如下,左边是一张灰度图,中间是使用半色调技术转换后输出的图像,右边是输出图像的局部放大

初始灰度图 半色调转换后的输出图像 输出图像局部放大(使用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实现半色调技术图像转换相关推荐

  1. 02 数字图像技术——颜色空间转换与颜色空间分割实验结果与分析——python

    04 数字图像技术--图像特征提取之实验结果与分析 03 数字图像技术--频域滤波实验结果与分析 02 数字图像技术--颜色空间转换与颜色空间分割实验结果与分析 01 数字图像基本操作--图像采样.量 ...

  2. 实验1-基于半色调技术的图像打印程序

    1.摘要 本实验采用半色调技术对图像进行打印和显示,对于256灰度级的图像,用二值像素进行描述,降低了对灰度级别的需求.首先,读入需要打印的图像,改变他的尺寸,使其半色调变换后能够适应A4纸张的大小: ...

  3. 豹变猫?实时场景转变?NVIDIA多模式图像转换技术都能实现

    内容来源:ATYUN AI平台 改变美洲豹身上的斑点似乎是个很有趣的想法,而这个想法也并非天方夜谭.通过NVIDIA新的加速GPU深度学习技术,无论是图片还是视频,甚至是实体美洲豹,都能使其变成猫.老 ...

  4. 使用Python和OpenCV在图像之间执行超快速的颜色转换

    使用Python和OpenCV在图像之间执行超快速的颜色转换 1. 效果图 2. 原理 2.1 颜色转移算法 2.2 步骤 2.3 算法改进 3. 源码 参考 这篇博客将介绍如何使用Python和Op ...

  5. 使用Python,OpenCV进行图像平移转换

    使用Python,OpenCV进行图像平移转换 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何使用Python,OpenCV对图像进行平移转换.平移是图像沿x轴和y轴的移动.使用平移, ...

  6. 【图像处理】基于半色调技术的图像打印程序(Image Printing Program Based on Halftoning)

    实验要求   本实验后面的图像给出了用点模式近似表示的10 个灰度级.每一个灰度级用一个3 x 3 的黑白点模式表示.用黑点全部填充的3 x 3 区域近似表示灰度级为0 的黑色灰度级,全部填充白点的3 ...

  7. 基于对抗生成网络的图像转换技术【论文笔记】

    前两篇文章是对方法的改进,详细地论证了提出的方法的可行性和优越性.后两篇是应用型,针对一个特定的问题提出方法. Image-to-Image Translation with Conditional ...

  8. Python 如何把图像转换成video (avi)格式?

    Python 如何把图像转换成video (avi)格式? import cv2 def image_to_video(image_dir, save_dir, size: tuple, fps=10 ...

  9. 译:ROS和Openv之间的图像转换(Python)

    描述:本教程介绍如何使用cv_bridge将ROS图像转换为OpenCV图像,反之亦然,从而实现ROS和OpenCV的交互. 包括一个示例节点,可用作您自己节点的模板. 1.概念 ROS以其自己的se ...

最新文章

  1. 手把手教你搭建 ELK 实时日志分析平台
  2. java 行为模式_java设计模式--行为模式
  3. windows 报错 没有文件扩展.vbs的脚本引擎 解决方法
  4. 网络规划设计(项目类业务)
  5. Webpack基础之加载器
  6. jQuery属性筛选选择器
  7. 为什么你的年薪只是别人的月薪?你需要技术专家帮你「充电」
  8. 亚马逊招聘,无人超市研发部门
  9. ( 转)Hibernate常用API
  10. JavaScript:屏蔽浏览器右键点击事件
  11. iMX8 Android SDK 下载
  12. GitHub 上有哪些优秀的 Python 爬虫项目?
  13. python使用opencv进行身份证信息识别_基于opencv和tesseract实现身份证扫描件的身份证号码提取试验...
  14. 服务器怎么与plc通讯协议,PLC如何与云服务器通讯
  15. 像智能手机一样造车,可能吗?
  16. 深度学习中如何选择一款合适的GPU卡的一些经验和建议分享
  17. 勾股数规律(任意三个数能够满足勾股定理需要满足的条件)
  18. PO模式项目实战思路分析
  19. 机器学习(线性回归实训)------波士顿房价
  20. 【BZOJ 3470】3470: Freda’s Walk 期望

热门文章

  1. html图片自适应div
  2. 计算机图形学(Intro/Math)
  3. 从电商营销谈SEM推广
  4. Oracle创建索引、视图SQL语句
  5. 深入浅出解释旋转变换矩阵
  6. Cypress 最佳实践
  7. SOME/IPSOME/IP-SD
  8. 前后端联调,比Postman更好用的国产接口调试工具:Apipost
  9. 猜数游戏 (do while循环
  10. PTA- 分段计算居民水费