數學之路-python計算實戰(14)-機器視覺-映像增強(長條圖均衡化),-python長條圖
我們來看一個灰階映像,讓表示灰階出現的次數,這樣映像中灰階為 的像素的出現機率是
是映像中所有的灰階數, 是映像中所有的像素數, 實際上是映像的長條圖,歸一化到 。
把 作為對應於 的累計機率函數, 定義為:
是映像的累計歸一化長條圖。
我們建立一個形式為 的變化,對於原始映像中的每個值它就產生一個 ,這樣 的累計機率函數就可以在所有值範圍內進行線性化,轉換公式定義為:
注意 T 將不同的等級映射到 域,為了將這些值對應回它們最初的域,需要在結果上應用下面的簡單變換:
上面描述了灰階映像上使用長條圖均衡化的方法,但是通過將這種方法分別用於映像RGB顏色值的紅色、綠色和藍色分量,從而也可以對彩色映像進行處理。
-
Python: cv2.equalizeHist(src[, dst]) → dst
-
C: void cvEqualizeHist(const CvArr*
src, CvArr*
dst)
-
| Parameters: |
- src – Source 8-bit single channel image.
- dst – Destination image of the same size and type as src .
|
The function equalizes the histogram of the input image using the following algorithm:
Calculate the histogram for src .
Normalize the histogram so that the sum of histogram bins is 255.
Compute the integral of the histogram:
Transform the image using as a look-up table:
The algorithm normalizes the brightness and increases the contrast of the image.
# -*- coding: utf-8 -*- #code:myhaspl@myhaspl.comimport cv2fn="test1.jpg"myimg=cv2.imread(fn)img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)newimg=cv2.equalizeHist(img)cv2.imshow('src',img)cv2.imshow('dst',newimg)cv2.waitKey()cv2.destroyAllWindows()
本部落格所有內容是原創,如果轉載請註明來源http://blog.csdn.net/myhaspl/下面右圖是經過增強化的圖
長條圖均衡化通常用來增加許多映像的全域對比,尤其是當映像的有用資料的對比相當接近的時候。通過這種方法,亮度可以更好地在長條圖上分布。這樣就可以用於增強局部的對比而不影響整體的對比
本部落格所有內容是原創,如果轉載請註明來源http://blog.csdn.net/myhaspl/下面部分代碼驗證實現了演算法
# -*- coding: utf-8 -*- #code:myhaspl@myhaspl.com#長條圖均衡化import cv2import numpy as npfn="test5.jpg"myimg=cv2.imread(fn)img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)h=img.shape[0]w=img.shape[1]newimg=np.zeros((h,w),np.uint8)scount=0.0#原始映像灰階級scol={}#靶心圖表像灰階級dcol={}#原始映像頻度Ps={}#累計機率Cs={}#統計原始映像灰階級for m in xrange(h): for n in xrange(w): scol[img[m,n]]=scol.setdefault(img[m,n],0)+1 scount+=1
左為源圖,右圖為進行長條圖均衡化後的圖
長條圖均衡化後的映像怎算 已知原映像,長條圖均衡化後的映像不要MATLAB程式我只明白原理就行
,是均衡前後的長條圖對比。
長條圖均衡化的意義在於:盡量讓每個亮度的點都一樣多,從而讓圖片的灰階細節盡量展現在人眼前,符合人眼查看圖片的規律。
所以舊圖的長條圖並不平坦,做完長條圖均衡化以後,長條圖就會趨向平坦。
就拿上面2張長條圖舉例:
假設一張圖片的的亮度最低是0,最高是255(我就不說灰階了)
1。假設圖片是一張M*M像素大小的圖片
2。轉換以後,假設,舊圖亮度在0-10之間的點數,等於新圖0-30之間的點數(因為舊圖很多點都擠在0-10之間,新圖要把這些點拉開)
3。又因為新圖是平坦的,所以我們很容易假設,亮度為30的點數,佔了總點數的1/256,也就是(M*M)/256
4。所以新圖中,0-30亮度之間的點數為30*(M*M)/256
5。根據上面2和4的關係列等式
30=(256/(M*M))*(亮度在0-10的點數總和)
6。把10換成p,30換成q,這樣對應任何舊圖中的p亮度,都可以計算出與之對應的新圖的亮度p。舊圖跟新圖的映射關係就出來了。
以上計算都是基於一個假設:(3)新圖的長條圖是平坦的。
參考資料:www.mathworks.cn/...q.html
為何長條圖均衡化可以有效增強映像
因為長條圖均衡化處理之後,原來比較少像素的灰階會被分配到別的灰階去,像素相對集中, 處理後灰階範圍變大,對比變大,清晰度變大,所以能有效增強映像。