摘要:對于非雙峰圖像,二值化不準確。如果未使用閾值法,則與之前使用的閾值相同在第一種情況下,將全局閾值應用為值在第二種情況下,直接應用了的閾值在第三種情況下,使用高斯內核過濾圖像以消除噪聲,然后應用閾值處理代碼
Image Thresholding
1簡單的閾值化cv2.threshold第一個參數是源圖像,它應該是灰度圖像. 第二個參數是用于對像素值進行分類的閾值, 第三個參數是maxVal,它表示如果像素值大于(有時小于)閾值則要給出的值. OpenCV提供不同類型的閾值,它由函數的第四個參數決定. 不同的類型是:
cv2.THRESH_BINARY | 如果 src(x,y)>threshold ,dst(x,y) = max_value; 否則,dst(x,y)=0 |
cv.THRESH_BINARY_INV | 如果 src(x,y)>threshold,dst(x,y) = 0; 否則,dst(x,y) = max_value |
cv.THRESH_TRUNC | 如果 src(x,y)>threshold,dst(x,y) = max_value; 否則dst(x,y) = src(x,y) |
cv.THRESH_TOZERO | 如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否則 dst(x,y) = 0 |
cv.THRESH_TOZERO_INV | 如果 src(x,y)>threshold,dst(x,y) = 0 ; 否則dst(x,y) = src(x,y) |
代碼:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread("img.jpg",0) ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC) ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO) ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) titles = ["Original Image","BINARY","BINARY_INV","TRUNC","TOZERO","TOZERO_INV"] images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] for i in range(6): plt.subplot(2,3,i+1),plt.imshow(images[i],"gray") plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()2自適應閾值化
圖像在不同區域具有不同照明條件時,應進行自適應閾值處理.因此,我們為同一圖像的不同區域獲得不同的閾值,并且它為具有不同照明的圖像提供了更好的結果.
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
adaptiveMethod:決定如何計算閾值
cv2.ADAPTIVE_THRESH_MEAN_C:閾值是鄰域的平均值
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:閾值是鄰域值的加權和,其中權重是高斯窗口
blockSize:決定了鄰域的大小
C:從計算的平均值或加權平均值中減去的常數
代碼:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread("img.jpg",0) img = cv2.medianBlur(img,5) ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,11,2) th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2) titles = ["Original Image", "Global Thresholding (v = 127)", "Adaptive Mean Thresholding", "Adaptive Gaussian Thresholding"] images = [img, th1, th2, th3] for i in range(4): plt.subplot(2,2,i+1),plt.imshow(images[i],"gray") plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
[lz是密集恐懼癥,有點不忍直視……]
3 大津閾值法根據雙峰圖像的圖像直方圖自動計算閾值。 (對于非雙峰圖像,二值化不準確。)
使用cv.threshold()但是傳遞了一個額外的標志v.THRESH_OTSU.對于閾值,只需傳遞零.然后算法找到最佳閾值并返回為第二個輸出retVal。如果未使用Otsu閾值法,則retVal與之前使用的閾值相同.
在第一種情況下,將全局閾值應用為值127.在第二種情況下,直接應用了Otsu的閾值.在第三種情況下,使用5x5高斯內核過濾圖像以消除噪聲,然后應用Otsu閾值處理.
代碼:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread("img.jpg",0) # global thresholding ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) # Otsu"s thresholding ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) # Otsu"s thresholding after Gaussian filtering blur = cv2.GaussianBlur(img,(5,5),0) ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) # plot all the images and their histograms images = [img, 0, th1, img, 0, th2, blur, 0, th3] titles = ["Original Noisy Image","Histogram","Global Thresholding (v=127)", "Original Noisy Image","Histogram","Otsu"s Thresholding", "Gaussian filtered Image","Histogram","Otsu"s Thresholding"] for i in range(3): plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],"gray") plt.title(titles[i*3]), plt.xticks([]), plt.yticks([]) plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256) plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([]) plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],"gray") plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([]) plt.show()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41990.html
摘要:最近看了阮一峰老師的相似圖片搜索的原理二,其中介紹了通過內容特征法來對比兩個圖片的相似性。不知道是不是哪步出錯了,感覺用這個方法計算出來的結果并不理想 最近看了阮一峰老師的相似圖片搜索的原理(二),其中介紹了通過內容特征法來對比兩個圖片的相似性。 大致步驟: 把圖片都縮放到50x50大小 轉成灰度圖片 利用大津法(Otsus method)確定閾值 通過閾值再對圖片進行二值化 對比兩...
摘要:使用,進行基本的圖像處理提取紅色圓圈輪廓并繪制效果圖源碼寫這篇博客源于博友的提問,想提取圖片中的紅色圓圈坐標,并繪制封閉的輪廓。還是使用一系列圖像處理,得到了比較理想的結果。 ...
閱讀 2573·2021-10-08 10:04
閱讀 2734·2021-09-06 15:02
閱讀 791·2019-08-30 13:50
閱讀 1547·2019-08-30 13:21
閱讀 2586·2019-08-30 11:15
閱讀 2112·2019-08-29 17:19
閱讀 1573·2019-08-26 13:55
閱讀 1260·2019-08-26 10:15