影象二值化(python+opencv)
定義:影象的二值化,就是將影象上的畫素點的灰度值設定為0或255,也就是將整個影象呈現出明顯的只有黑和白的視覺效果。
一幅影象包括目標物體、背景還有噪聲,要想從多值的數字影象中直接提取出目標物體,常用的方法就是設定一個閾值T,用T將影象的資料分成兩部分:大於T的畫素群和小於T的畫素群。這是研究灰度變換的最特殊的方法,稱為影象的二值化(Binarization)。
全域性閾值:
Python-OpenCV中提供了閾值(threshold)函式:cv2.threshold(src, threshold, maxValue, method)
src原圖:破折線為將被閾值化的值;虛線為閾值
cv2.THRESH_BINARY:大於閾值的畫素點的灰度值設定為maxValue(如8位灰度值最大為255),灰度值小於閾值的畫素點的灰度值設定為0。
cv2.THRESH_BINARY_INV :大於閾值的畫素點的灰度值設定為0,而小於該閾值的設定為maxValue。
cv2.THRESH_TRUNC:畫素點的灰度值小於閾值不改變,大於閾值的灰度值的畫素點就設定為該閾值。
cv2.THRESH_TOZERO:畫素點的灰度值小於該閾值的不進行任何改變,而大於該閾值的部分,其灰度值全部變為0。
cv2.THRESH_TOZERO_INV:畫素點的灰度值大於該閾值的不進行任何改變,畫素點的灰度值小於該閾值的,其灰度值全部變為0。
Python+opencv程式碼:
def getPicMinRect(pic):
GrayImage = np.array(pic).reshape(40,40).astype(np.uint8)
ret,thresh1=cv2.threshold(GrayImage,10,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(GrayImage,10,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(GrayImage,10,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(GrayImage,10,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(GrayImage,10,255,cv2.THRESH_TOZERO_INV)
titles = ['Gray Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [GrayImage, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in xrange(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
自適應閾值:
當同一幅影象上的不同部分的具有不同亮度時。這種情況下我們需要採用自適應閾值。此時的閾值是根據影象上的每一個小區域計算與其對應的閾值。因此在同一幅影象上的不同區域採用的是不同的閾值,從而使我們能在亮度不同的情況下得到更好的結果。
Python-OpenCV中提供了閾值(threshold)函式:cv2.adaptiveThreshold(src, maxValue, adaptive_method, threshold_type, block_size, param1)
好吧,這玩意的threshold_type其實就兩種:CV_THRESH_BINARY, CV_THRESH_BINARY_INV
adaptive_method也有兩種: CV_ADAPTIVE_THRESH_MEAN_C, CV_ADAPTIVE_THRESH_GAUSSIAN_C
函式 cvAdaptiveThreshold 將灰度影象變換到二值影象,採用下面公式:
switch(threshold_type):
case CV_THRESH_BINARY:
if src(x,y)>T(x,y):
dst(x,y) = maxValue
else:
dsy(x,y) = 0
case CV_THRESH_BINARY_INV:
if src(x,y)>T(x,y):
dst(x,y) = 0
else:
dsy(x,y) = maxValue
其中 T(x,y)為當前畫素點單獨計算的閾值
對方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出block中的均值,再減掉param1。
對方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出block中的加權和(gaussian), 再減掉param1。
Python+opencv程式碼:
def getPic(pic):
GrayImage = np.array(pic).reshape(40,40).astype(np.uint8)
th1 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,3,5)
th2 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,3,50)
th3 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,5)
th4 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,50)
titles = ['Gray Image', 'Adaptive Mean prama1=5',
'Adaptive Mean prama1=50', 'Adaptive Gaussian prama1=5','Adaptive Gaussian prama1=50']
images = [GrayImage, th1, th2, th3, th4]
for i in xrange(5):
plt.subplot(2,3,i+1),plt.imshow(images[i])
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
相關文章
- Python-OpenCV 處理影象(八):影象二值化處理PythonOpenCV
- 二值影象分析之輪廓分析
- Python+OpenCV 影象風格遷移(模仿名畫)PythonOpenCV
- 小強學Python+OpenCV之-1.2影象基礎PythonOpenCV
- [Python影象處理] 七.影象閾值化處理及演算法對比Python演算法
- 二值影象分析:案例實戰(文字分離+硬幣計數)
- python+opencv檢測圖片中二維碼PythonOpenCV
- python - 圖片灰度化、二值化Python
- [影象處理] Python+OpenCV實現車牌區域識別及Sobel運算元PythonOpenCV
- MATLAB數字影象處理(二)影象增強Matlab
- 圖形影象處理-之-高質量的快速的影象縮放 中篇 二次線性插值和三次卷積插值卷積
- 網格缺陷檢測(二值化閾值分析)
- 十三種基於直方圖的影象全域性二值化演算法原理、實現、程式碼及效果。直方圖演算法
- 影象縮放--插值法(opencv,原理)OpenCV
- 【數字影象處理】五.MFC影象點運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理詳解
- 基於模糊集理論的一種影象二值化演算法的原理、實現效果及程式碼演算法
- c#影象處理入門(-bitmap類和影象畫素值獲取方法)C#
- 【查蟲日誌】快速判斷一副灰度影象中是否只有黑色和白色值(即是否為二值影象)過程中bool變數的是是非非。變數
- matlab中將RGB影象轉化為灰度影象Matlab
- Python-OpenCV 處理影象(二):濾鏡和影象運算PythonOpenCV
- 彩色影像二值化函式(matlab)函式Matlab
- 譯文:影象優化(上)優化
- 淺談 Web 影象優化Web優化
- 數值最優化—優化問題的解(二)優化
- 圖形影象處理-之-高質量的快速的影象縮放 上篇 近鄰取樣插值和其速度優化優化
- 數字影象處理之二維碼影象提取演算法(一)演算法
- Swift-影象的效能優化Swift優化
- Python-OpenCV 處理影象(七):影象灰度化處理PythonOpenCV
- 影象處理 二維小波變換
- Android影像灰度化、線性灰度變化、二值化處理方法Android
- C++ OpenCv二值化找圓心座標C++OpenCV
- Python資料視覺化影象庫MatPlotLib基本影象操作Python視覺化
- 二值影像
- MacOS配置Python+Opencv環境MacPythonOpenCV
- OpenCV之影象直方圖均衡化OpenCV直方圖
- 影象的卷積和池化操作卷積
- matlab練習程式(影象球面化)Matlab
- Halide:簡化影象程式設計IDE程式設計