python 简单图像处理(8) 直方图均衡化
直方圖均衡化就是把一已知灰度概率分布的圖像經過一種變換使之演變成一幅具有均勻灰度概率分布的新圖像
它是以累積分布函數變換法為基礎的直方圖修正法
我們來看看直方圖的含義
還是以上次我們講的例子為例
?
我們看到R通道的直方圖主要集中在亮部,所以R通道灰度圖看起來較白
而B通道的直方圖主要集中在暗部,而對應的B通道灰度圖看起來很暗
G通道分布比較均勻,但有點偏暗
好了,這就是直觀的理解
而清晰柔和的圖像的直方圖灰度分布比較均勻
?
什么是累積分布函數呢,我們先看看直方圖的畫法,每一個橫坐標上縱坐標的高度對應于灰度值為該值的像素點的個數
若我們定義一個橫坐標對應縱坐標高度是所有小于該灰度值的像素點的個數
這就是我們說的累積分布
灰度值為1處對應灰度值為1的點
灰度值為2處對應灰度值為1和2的點
灰度值為3處對應灰度值為1、2、3的點
·······
灰度值為255處對應所有的點
好啦
我們來看看累積分布直方圖的效果吧
?
直方圖均衡化的方法如下:
紅色部分是原圖累積分布函數輪廓線
而理想的均衡化累積分布函數輪廓線應該是一條斜線
對于原圖中灰度值為80的點,按圖中的方法我們把它轉換為灰度值為60
對每個灰度值,我們建立一個轉換表,再對原圖進行轉換,就可以得到均衡化后的圖了
我們來看看具體程序
import cvdef Hist(image,color = cv.RGB(102,204,204)):
a = [0]*256
w = image.width
h = image.height
iHist = cv.CreateImage((256,256),8,3)
for i in range(h):
for j in range(w):
iGray = int(image[i,j])
a[iGray] = a[iGray] +1
S = max(a)
for k in range(256):
a[k] = a[k]*255/S
x = (k,255)
y = (k,255-a[k])
cv.Line(iHist,x,y,color)
return iHist
def LHist(image,color = cv.RGB(102,204,204)):
a = [0]*256
w = image.width
h = image.height
iLHist = cv.CreateImage((256,256),8,3)
for i in range(h):
for j in range(w):
iGray = int(image[i,j])
a[iGray] = a[iGray] +1
for i in range(1,256):
a[i] = a[i]+a[i-1]
S = max(a)
for k in range(256):
a[k] = a[k]*255/S
x = (k,255)
y = (k,255-a[k])
cv.Line(iLHist,x,y,color)
return iLHist
def Equalize(image):
a = [0]*256
w = image.width
h = image.height
size = (w,h)
iEqualize = cv.CreateImage(size,image.depth,1)
for i in range(h):
for j in range(w):
iGray = int(image[i,j])
a[iGray] = a[iGray] +1
for i in range(1,256):
a[i] = a[i]+a[i-1]
S = max(a)
for k in range(256):
a[k] = a[k]*255/S
for i in range(h):
for j in range(w):
iEqualize[i,j] = a[int(image[i,j])]
return iEqualize
image = cv.LoadImage('lena.jpg',0)
iHist = Hist(image)
iLHist = LHist(image)
iEqualize = Equalize(image)
iEHist = Hist(iEqualize,cv.RGB(153,204,54))
iELHist = LHist(iEqualize,cv.RGB(153,204,54))
cv.ShowImage('image',image)
cv.ShowImage('iHist',iHist)
cv.ShowImage('iLHist',iLHist)
cv.ShowImage('iEqualize',iEqualize)
cv.ShowImage('iEHist',iEHist)
cv.ShowImage('iELHist',iELHist)
cv.WaitKey(0)
看看運行效果
現在圖像的直方圖分布比較均勻了
但很難得到完全均衡的結果,另外,變換后的灰度級減少了。
這種現象叫做“簡并”現象。由于簡并現象的存在,處理后的灰度級總是要減少的
直觀反映就是均衡后直方圖在垂直方向上有很多黑線
好啦,直方圖均衡化就講到這里啦
轉載于:https://www.cnblogs.com/xianglan/archive/2010/12/28/1918694.html
總結
以上是生活随笔為你收集整理的python 简单图像处理(8) 直方图均衡化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Scrum】2010.12.27
- 下一篇: ASP.NET+SQL创建存储过程