上海网站制作建设是什么,做ipo尽调需要用到的网站,手机赚钱一天400元,个人网站建设的步骤过程半色调技术
半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。
比如说#xff0c;在一块只能显示纯黑或纯白的屏幕上#xff0c;如何将一张灰度图显示出灰度的效果#xff0c;这时就可以用半色调技术实现。
如下…半色调技术
半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。
比如说在一块只能显示纯黑或纯白的屏幕上如何将一张灰度图显示出灰度的效果这时就可以用半色调技术实现。
如下左边是一张灰度图中间是使用半色调技术转换后输出的图像右边是输出图像的局部放大
初始灰度图半色调转换后的输出图像输出图像局部放大(使用win10自带【画图】软件打开放大)
原理
基本原理
我们都知道一个像素点有0~255共256种灰度值值越大图像越“白”反之越“黑”。
对于一些屏幕只能显示0或1用1表示255两种灰度值也就是只能显示纯黑或纯白这怎么办
半色调技术实际是把一个像素点用一个矩阵块来表示如果像素值比较大越白那么矩阵快白色部分就越多如图所示 这个矩阵就是bayer矩阵矩阵边长可以选择124816上图矩阵边长是2
如果是16那么就可以表示16*16256种灰度值了
如上图所示对于边长为2的bayer矩阵假如只有4种颜色值0123如果像素值比0大那么就把bayer矩阵的位置0设置为白色如果比1大就把位置0和1都设置为白色……
但实际上灰度值有256种因此bayer矩阵需要乘以(256/(2*2))如下 如果像素值比128大那么064128这3个位置都设置为白色
可以看出假设输入图像边长为abayer矩阵边长为k则输出图像的边长为a*k即是输入图像的k倍
bayer矩阵生成 注意整数*矩阵即矩阵的数乘运算相当于矩阵每个元素都乘以一个整数 根据这个公式可以写出一个代码
def getStandardMat(k):函数作用获取bayer矩阵return是否生成成功成功的话同时返回numpy类型的矩阵k: 是bayer矩阵的阶数取值一般为1 2 4 8 16if 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*m2m1[m.shape[0]:, :m.shape[1]] 4*m3m1[m.shape[0]:, m.shape[1]:] 4*m1m m1return True, m测试一下 实践操作
该程序实现读取一张RGB图片转为灰度图后再采用变色调技术转换图片
使用该程序只需要修改输入图片路径以及输出图片路径即可
# 该文件实现半色调技术的代码import cv2
import numpy as npdef getBayerMat(k):函数作用获取bayer矩阵return是否生成成功成功的话同时返回numpy类型的矩阵k: 是bayer矩阵的阶数取值一般为1 2 4 8 16if 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*m2m1[m.shape[0]:, :m.shape[1]] 4*m3m1[m.shape[0]:, m.shape[1]:] 4*m1m m1return True, mdef convertImg(img, k4, fFalse, useGrayFalse):kbayer矩阵大小f由于转换后图像尺寸会变大k倍f表示是否先缩小k倍useGray传入的img是否为灰度图if not useGray:img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)if f:img cv2.resize(img, dsizeNone, fx1/k, fy1/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), dtypeuint8)# 遍历图像每个像素点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 rD:\Users\xxx\Desktop\imgs\1-1.jpgimg cv2.imread(imgPath, 0) # 读取图片并转为灰度图nimg convertImg(img, k4, fFalse, useGrayTrue)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