python图像处理:直⽅图的规定化(直⽅图匹配)
写在前⾯潜水艇怎么画
因为笔者数字图像处理的作业是要求⽤VB来做规定化的处理,笔者写出来后想看看python有什么库可以实现,毕竟像均衡化之类的操作都可以通过py的cv2库⾥的函数解决,但是在CSDN上查询的时候发现⼤家都是⽤openCV或者matlab来做,python并没有相关的函数来进⾏规定化,唯⼀⼀个有规定化代码的但是是需要付钱的,于是笔者就⽤python写了⼀个可以做灰度图像直⽅匹配的代码。
(⼀)直⽅图匹配原理介绍
直⽅图规定化,也叫做直⽅图匹配,⽤于将图像变换为某⼀特定的灰度分布,也就是其⽬的的灰度直⽅图是已知的。这其实和均衡化很类似,均衡化后的灰度直⽅图也是已知的,是⼀个均匀分布的直⽅图;⽽规定化后的直⽅图可以随意的指定,也就是在执⾏规定化操作时,⾸先要知道变换后的灰度直⽅图,这样才能确定变换函数。规定化操作能够有⽬的的增强某个灰度区间,相⽐于,均衡化操作,规定化多了⼀个输⼊,但是其变换后的结果也更灵活。
(⼆)直⽅图匹配的实现
直⽅图规定化的实现可以分为⼀下四步:
1. 计算原图像的累积直⽅图
罗马神话故事
2. 计算规定直⽅图的累积直⽅图
3. 计算两累积直⽅图的差值的绝对值
4. 根据累积直⽅图差值建⽴灰度级的映射
(三)编码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt
img0=cv2.imread(r'C:\Urs\58381\Desktop\lena.bmp')#读取原图⽚
scr=cv2.imread(r'C:\Urs\58381\Desktop\circle.bmp')#读取⽬标图⽚命令近义词
完成读取之后转图⽚为灰度图⽚,笔者⽬前只会做灰度图⽚的规定化
#把两张图⽚转成真正的灰度图⽚,因为⾃⼰只会做灰度图⽚的规定化
img0=cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY)
py()#⽤于之后做对⽐图
scr=cv2.cvtColor(scr,cv2.COLOR_BGR2GRAY)
构造做映射的列表
mHist1=[]
mNum1=[]
inhist1=[]
mHist2=[]
mNum2=[]
inhist2=[]
下⾯分别对两张图像进⾏均衡化
#对原图像进⾏均衡化
for i in range(256):
mHist1.append(0)
row,col=img.shape#获取原图像像素点的宽度和⾼度
for i in range(row):
for j in range(col):
mHist1[img[i,j]]= mHist1[img[i,j]]+1#统计灰度值的个数
mNum1.append(mHist1[0]/img.size)
for i in range(0,255):
mNum1.append(mNum1[i]+mHist1[i+1]/img.size)
for i in range(256):
inhist1.append(round(255*mNum1[i]))
#对⽬标图像进⾏均衡化
for i in range(256):
mHist2.append(0)
rows,cols=scr.shape#获取⽬标图像像素点的宽度和⾼度
for i in range(rows):
for j in range(cols):
mHist2[scr[i,j]]= mHist2[scr[i,j]]+1#统计灰度值的个数
mNum2.append(mHist2[0]/scr.size)
for i in range(0,255):
mNum2.append(mNum2[i]+mHist2[i+1]/scr.size)
for i in range(256):
inhist2.append(round(255*mNum2[i]))
两张图⽚都均衡化好之后,就通过数组间的映射进⾏规定化处理
#进⾏规定化
g=[]#⽤于放⼊规定化后的图⽚像素
for i in range(256):
a=inhist1[i]
flag=True
for j in range(256):
双流火灾if inhist2[j]==a:
g.append(j)
乳酸菌阴胶囊flag=Fal
break
if flag==True:
minp=255
for j in range(256):
b=abs(inhist2[j]-a)
if b<minp:
粉色的英文单词minp=b
jmin=j
g.append(jmin)
for i in range(row):
for j in range(col):
img[i,j]=g[img[i,j]]
在这⾥规定化就完成了,我们来看看效果。先看看原图像以及其灰度直⽅图
cv2.imshow("原图",img0)
cv2.waitKey(0)
plt.hist(img0.ravel(),256)
plt.show()
然后是⽬标图⽚的原图以及直⽅图
猪笼草的资料cv2.imshow("⽬标图",scr)
cv2.waitKey(0)
plt.hist(scr.ravel(),256)
plt.show()
然后看看规定化之后的图⽚以及其直⽅图
cv2.imshow("规定化",img)
cv2.waitKey(0)
plt.hist(img.ravel(),256)
plt.show()
最后把两张图⽚⼀起展⽰。
写在最后
传染病报告我会尽快在做完测量的作业之后把彩⾊图⽚的规定化编好,由于时间有限,笔者的代码不是特别精简,有很多地⽅可以优化,⼤家凑合着看看。