数字图像处理-直⽅图均衡化,直⽅图规定化
本⽂主要阐述了本次作业中解决的四个问题,分别是灰度处理,直⽅图均衡化,直⽅图规定话GML,SML
⼀、图像预处理
1.1颜⾊转换意义
在图像处理过程中,我们⽇常的环境通常获得的是彩⾊图像,。⼀般为了减⼩图像原始数据量,便于后续处理时计算量更少,因为图像处理不⼀定需要对彩⾊图像的RGB三个分量都进⾏处理,将彩⾊图像转换成灰度图像。也就是3个通道(opencv中是BGR的顺序)转换成1个通道。三通道转为⼀通道后,运算量⼤⼤减少。
1.2灰度原理及⽅法
将彩⾊图像转换成灰度图像,也就是3个通道(RGB)转换成1个通道。 图像由彩⾊图转化为⼀般有灰度图有三种⽅法。分别为加权法、均值法、最⼤值法。
(1)加权法就是⼏个加权系数0.3,0.59,0.11这是根⼈的亮度感知系统调节出来的参数,是个⼴泛使⽤的标准化参数。
(2)均值法就是将同⼀个像素位置3个通道RGB的值进⾏平均。
(3)最⼤最⼩平均法就是取同⼀个像素位置的RGB中亮度最⼤的和最⼩的进⾏平均。
1.3灰度处理关键程序及处理结果
j
iuliang = cv2.imread("D:\\opencv_image\\jiuliang.jpg")#舍友最爱的周九良
row, col, channel = jiuliang.shape
''' 取平均法:创建与原图像⾏列相同的空矩阵,将三个通道进⾏取平均再赋值给空矩阵即可得到'''
jiuliang_gray = np.zeros((row, col))
for r in range(row):
for l in range(col):
jiuliang_gray[r, l]=1/3* jiuliang[r, l,0]+1/3* jiuliang[r, l,1]+1/3* jiuliang[r, l,2]
''' 最⼤值最⼩值平均法,取图像三个通道⾥的最⼤和最⼩值的和求平均'''
max_jiuliang_gray = np.zeros((row, col))
for r in range ( row ):
for l in range ( col ):
max_jiuliang_gray[r, l]=1/2*max(jiuliang[r,l,0], jiuliang[r, l,1], jiuliang[r, l,2])+1/2* min (jiuliang[r, l,0], jiuliang[r, l,1], jiuliang[r, l,2])
''' 加权平均法,取图像三个通道⾥的最⼤和最⼩值的和求平均'''
weight_jiuliang_gray = np.zeros((row, col))
for r in range(row):
for l in range(col):
weight_jiuliang_gray[r, l]=0.11* jiuliang[r, l,0]+0.59* jiuliang[r, l,1]+0.3* jiuliang[r, l,2]
1.5三种灰度处理⽅法所得结果
图1:原图
图2:平均值法灰度处理
图3:最⼤值最⼩值处理
图4:加权平均处理
经实验发现 上述灰度效果相似,即使上边遍历了去尝试,但是其实python其实⼀句话就可以搞定
img = cv2.imread ( ‘D:\opencv_image\jiuliang.jpg’, cv2.IMREAD_GRAYSCALE)
⼆、 直⽅图均衡化
1、灰度直⽅图分析
灰度直⽅图是反映⼀幅图像中各灰度级像素出现的频率与灰度级的关系,以灰度级为横坐标,频率为纵坐标,绘制频率同灰度级的关系图像就是⼀幅灰度图像的直⽅图。简单地说,就是把⼀幅图像中每⼀个像素出现的次数都先统计出来,然后把每⼀个像素出现的次数除以总的像素个数,得到的就是这个像素出现的频率,然后再把像素与该像素出现的频率⽤图表⽰出来,就是灰度直⽅图。图像的灰度直⽅图就描述了图像中灰度分布情况,能够很直观的展⽰出图像中各个灰度级所占的多少。
2、直⽅图均衡化原理
在⼀幅图像中,明亮图像的直⽅图倾向于灰度级⾼的⼀侧,灰暗图像的直⽅图倾向于灰度级低的⼀侧,如果⼀副图像占有全部可能的灰度级并且分布均匀,则这样的图像有⾼对⽐度和多变的灰度⾊调。直⽅图均衡化这种⽅法通常⽤来增加图像的局部对⽐度。所以这种⽅法对于图像前景和背景都太亮或者太暗的情况⾮常有⽤,使⽬标区域从背景脱离出来。
直⽅图均衡化处理的“中⼼思想”是把原始图像的灰度直⽅图从⽐较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直⽅图均衡化就是对图像进⾏⾮线性拉伸,重新分配图像像素值,使⼀定灰度范
围内的像素数量⼤致相同。直⽅图均衡化就是把给定图像的直⽅图分布改变成“均匀”分布直⽅图分布。它的基本思想是对图像中像素个数多的灰度级进⾏展宽,⽽对图像中像素个数少的灰度进⾏压缩,从⽽扩展像原取值的动态范围,提⾼了对⽐度和灰度⾊调的变化,使图像更加清晰。
3、直⽅图绘制流程
(1)计算图像各灰度像素数⽬
for rv in img:#遍历图像
for cv in rv:
prob[cv] += 1#算出现次数
(2)计算各灰度出现的概率
h, w = img.shape#图像⼤⼩
prob = prob / (h * w)#算概率
(3)计算各灰度出现的概率
prob = np.cumsum(prob) # 计算累计概率
img_map = [int(255 * prob[i]+0.5) for i in range(256)] #像素值 映射的新图
直⽅图均衡化绘制流程图
(4)图像映射
像素值替换
r, c = img.shape
for ri in range®:
for ci in range©:
img[ri, ci] = img_map[img[ri, ci]] return img
4、直⽅图均衡化前后结果对⽐分析
以清明节放假班级登记表为例原图如下:
均衡化后图像如下:
均衡化前后其直⽅图如下:
图2:班级登记表原图直⽅
图3:均衡后其直⽅图如:
三、直⽅图规定化
直⽅图规定化,也叫做直⽅图匹配,⽤于将图像变换为某⼀特定的灰度分布,也就是其⽬的的灰度直
⽅图是已知的。这其实和均衡化很类似,均衡化后的灰度直⽅图也是已知的,是⼀个均匀分布的直⽅图;⽽规定化后的直⽅图可以随意的指定,也就是在执⾏规定化操作时,⾸先要知道变换后的灰度直⽅图,这样才能确定变换函数。规定化操作能够有⽬的的增强某个灰度区间,相⽐于,均衡化操作,规定化多了⼀个输⼊,但是其变换后的结果也更灵活。
1、直⽅图匹配的实现
直⽅图规定化的实现可以分为⼀下四步:
1)计算原图像的累积直⽅图
2)计算规定直⽅图的累积直⽅图
3)计算两累积直⽅图的差值的绝对值
4)根据累积直⽅图差值建⽴灰度级的映射
2、GML和SML原理
GML规定化(组映射)
先列出图像灰度值i,j,计算原始直⽅图各个灰度值概率Pr(i),规定直⽅图各个灰度值概率Pz(j),计算原始累计直⽅图P(i)和规定累计直⽅图
P(j),然后按照P(j)到P(i)寻最接近的值存储为j,当满⾜给定的值多于⼀个时,按惯例取最⼩值。确定变换关系为i->j,最后列出匹配直⽅图P(j)。
SML规定化(单映射)
GML规定化中求累积概率过程与SML⼀致,但在映射关系上与SLM有所区别,GML采⽤分组映射。且对⽐时是从⽬标的累积概率⼀⼀与原始图像的累积概率取绝对值最⼩。
两种⽅式的具体列⼦如下图:
图:直⽅图规定化实列
2、GML和SML实现
(1)SML求累积概率:
def pixel_probability(img):
"""
计算像素值出现概率
"""
assert isinstance(img, np.ndarray)
prob = np.zeros(shape=(256))
for rv in img:#算出现次数
for cv in rv:
prob[cv]+=1
h, w = img.shape
prob = prob/(h * w)#算概率
return prob
prob =pixel_probability(src)
plot(prob,"原图直⽅图")
prob = np.cumsum ( prob ) #计算原始累计概率
(2)#SML直⽅图规定化
局部直方图均衡化diff_cdf =[[0for j in range (256)]for k in range (256)] # diff_cdf ⾥是每2个灰度值⽐率间的差值
for j in range (256):
for k in range (256):
diff_cdf[j][k]= abs ( prob[j]- prob1[k])
lut =[0for j in range (256)] # 映射表
for j in range (256):
min = diff_cdf[j][0]
index =0
for k in range (256): # 直⽅图规定化的映射原理
if min > diff_cdf[j][k]:
min = diff_cdf[j][k]#最⼩差值
index = k#保存下标
lut[j]=([j, index])
h =int( img.shape[0])
w =int( img.shape[1])
for j in range ( h ): #对原图像进⾏灰度值的映射
for k in range ( w ):
img_new1[j, k]= lut[src[j, k]][1]
(3)SML规定化结果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论