使用Python+OpenCV進(jìn)行圖像處理(二)
圖像預(yù)處理對于整個(gè)圖像處理任務(wù)來講特別重要。如果我們沒有進(jìn)行恰當(dāng)?shù)念A(yù)處理,無論我們有多么好的數(shù)據(jù)也很難得到理想的結(jié)果。
本篇是視覺入門系列教程的第二篇。整個(gè)視覺入門系列內(nèi)容如下:
理解顏色模型與在圖像上繪制圖形(圖像處理基本操作)。
基本的圖像處理與濾波技術(shù)。
從特征檢測到人臉檢測。
圖像分割與分水嶺(Watershed)算法(TBU)
在邊緣和輪廓檢測中,噪聲對檢測的精度有很大的影響。因此,去除噪聲和控制像素值的大小可以幫助模型聚焦于整體特征,獲得更高的精度。對應(yīng)的圖像處理技術(shù)包括:模糊化(Blurring)、閾值化(thresholding)和形態(tài)轉(zhuǎn)換(morphological transformation)。本篇我們將詳細(xì)介紹這幾個(gè)常見的圖像預(yù)處理技術(shù)。(本文假設(shè)讀者已經(jīng)熟悉卷積的概念。)
模糊化(Blurring)
模糊化的目標(biāo)是實(shí)現(xiàn)降噪。我們必須格外注意的是:如果我們把邊緣檢測算法應(yīng)用到高分辨率的圖像上,我們就會得到很多我們不感興趣的檢測結(jié)果;
相反,如果我們把圖像模糊太多,我們就會丟失數(shù)據(jù)。因此,我們需要找到一個(gè)適當(dāng)?shù)哪:,從而不失去理想的邊緣?/p>
有多種技術(shù)用于實(shí)現(xiàn)模糊效果,在這里我們討論OpenCV中常用的四種技術(shù):平均模糊(Averaging blurring)、高斯模糊(Gaussian blurring)、中值模糊(median blurring)和雙邊濾波(bilateral filtering)。這四種技術(shù)應(yīng)用一個(gè)共同的基本原理,即使用濾波器(內(nèi)核)對圖像進(jìn)行卷積運(yùn)算。不同的是,在四種模糊方法中使用的濾波器的值是不同的。
平均模糊(Average blurring)是取給定內(nèi)核(kernel)區(qū)域下所有像素值的平均值替換中心的值。例如,假設(shè)給定一個(gè)大小為5X5的內(nèi)核(kernel),我們計(jì)算卷積結(jié)果的平均值,并將結(jié)果放在給定區(qū)域的中心。示例如下:
如果我們增加內(nèi)核的大小,像素值將更加歸一化。因此圖像也會變得越來越模糊。讓我們用下面的代碼對比處理結(jié)果。(為了便于比較,將把原始圖像加到結(jié)果中,進(jìn)行對比顯示。)
# Import the image and convert to RGB
img = cv2.imread('text.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# Plot the image with different kernel sizes
kernels = [5, 11, 17]
fig, axs = plt.subplots(nrows = 1, ncols = 3, figsize = (20, 20))
for ind, s in enumerate(kernels):
img_blurred = cv2.blur(img, ksize = (s, s))
ax = axs[ind]
ax.imshow(img_blurred)
ax.a(chǎn)xis('off')
plt.show()
中值模糊(Medium blurring)和平均模糊(Average blurring)是一樣的,只是它使用的是中值而不是平均值。正由于這個(gè)特性,當(dāng)我們需要處理圖像中突然出現(xiàn)的噪音時(shí)(如“椒鹽噪音”),使用中值模糊(medium blurring)的效果要比平均模糊(average blurring)效果好。
高斯模糊(Gaussian blurring)是使用“值”具有高斯分布的核函數(shù)。由于這些值是由高斯函數(shù)生成的,因此它的參數(shù)需要一個(gè)sigma值。如上圖,內(nèi)核的值在靠近中心的地方變高,在靠近角的地方變小。將該方法應(yīng)用于具有正態(tài)分布的噪聲,如白噪聲,效果較好。
雙邊濾波(Bilateral Filtering)是高斯模糊的一個(gè)高級版本。模糊化不僅可以溶解噪聲,而且還會平滑邊緣。而雙邊濾波器能在去除噪聲的同時(shí)保持邊緣銳化。這是由于它不僅使用高斯分布值,還同時(shí)考慮了距離和像素值的差異。因此,需要指定sigmaSpace和sigmaColor這兩個(gè)參數(shù)。
# Blur the image
img_0 = cv2.blur(img, ksize = (7, 7))
img_1 = cv2.GaussianBlur(img, ksize = (7, 7), sigmaX = 0)
img_2 = cv2.medianBlur(img, 7)
img_3 = cv2.bilateralFilter(img, 7, sigmaSpace = 75, sigmaColor =75)
# Plot the images
images = [img_0, img_1, img_2, img_3]
fig, axs = plt.subplots(nrows = 1, ncols = 4, figsize = (20, 20))
for ind, p in enumerate(images):
ax = axs[ind]
ax.imshow(p)
ax.a(chǎn)xis('off')
plt.show()
閾值化(Thresholding)
圖像的閾值化就是利用圖像像素點(diǎn)分布規(guī)律,設(shè)定閾值進(jìn)行像素點(diǎn)分割,進(jìn)而得到圖像的二值圖像。我們需要設(shè)置閾值和最大值,然后據(jù)此相應(yīng)地進(jìn)行像素值轉(zhuǎn)換。常用的閾值化包含有五種不同的類型:二進(jìn)制閾值化、反二進(jìn)制閾值化、閾值化到零、反閾值化到零,和閾值截?cái)唷?/strong>
img = cv2.imread('gradation.png')
# Thresholding
_, thresh_0 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
_, thresh_1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
_, thresh_2 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
_, thresh_3 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
_, thresh_4 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
# Plot the images
images = [img, thresh_0, thresh_1, thresh_2, thresh_3, thresh_4]
fig, axs = plt.subplots(nrows = 2, ncols = 3, figsize = (13, 13))
for ind, p in enumerate(images):
ax = axs[ind//3, ind%3]
ax.imshow(p)
plt.show()
如上圖所示,每種類型的閾值都可以用數(shù)學(xué)公式表示,I(x, y)是像素點(diǎn)的強(qiáng)度(也稱為點(diǎn)(x, y)的像素值)。上圖中的圖像示例,可以更直觀的理解不同閾值化類型之間的區(qū)別。
只取一個(gè)閾值并將其應(yīng)用于圖像的所有部分并不能滿足我們的全部需求。如果我們有一張?jiān)诙鄠(gè)不同區(qū)域亮度差異較多的圖片這種情況,將一個(gè)值應(yīng)用于整個(gè)圖像一般不利于我們的圖像處理任務(wù)。其對應(yīng)更好的方法是對圖像的每個(gè)部分使用不同的閾值。對應(yīng)這種情況還有另外一種閾值化技術(shù)稱為自適應(yīng)閾值化(Adaptive threshilding)。通過對圖像鄰域內(nèi)閾值的計(jì)算,可以得到不同光照條件下的較好結(jié)果。
# Convert the image to grayscale
img = cv2.imread('text.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Adaptive Thresholding
_, thresh_binary = cv2.threshold(img, thresh = 127, maxval = 255, type = cv2.THRESH_BINARY)
adap_mean_2 = cv2.a(chǎn)daptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_M(jìn)EAN_C,
cv2.THRESH_BINARY, 7, 2)
adap_mean_2_inv = cv2.a(chǎn)daptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_M(jìn)EAN_C,
cv2.THRESH_BINARY_INV, 7, 2)
adap_mean_8 = cv2.a(chǎn)daptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_M(jìn)EAN_C,
cv2.THRESH_BINARY, 7, 8)
adap_gaussian_8 = cv2.a(chǎn)daptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 7, 8)
我們需要將顏色模式轉(zhuǎn)換為灰度來進(jìn)行自適應(yīng)閾值化。自適應(yīng)閾值的參數(shù)有maxValue(在上面的示例中設(shè)置為255)、adaptiveMethod、thresholdType、blocksize和C。這里使用的自適應(yīng)方法有兩種:adaptivethresholdmeanc和adaptivethresholdgaussianc。讓我們通過下方代碼對比自適應(yīng)閾值化的不同結(jié)果。
# Plot the images
images = [img, thresh_binary, adap_mean_2, adap_mean_2_inv,
adap_mean_8, adap_gaussian_8]
fig, axs = plt.subplots(nrows = 2, ncols = 3, figsize = (15, 15))
for ind, p in enumerate(images):
ax = axs[ind%2, ind//2]
ax.imshow(p, cmap = 'gray')
ax.a(chǎn)xis('off')
plt.show()
如上圖所示,左邊為原始圖像與二進(jìn)制閾值化結(jié)果圖。對比二進(jìn)制閾值化結(jié)果圖與右上方兩張結(jié)果圖(由adaptivethresholdmeanc方法生成)可得,后者生成了更為詳細(xì)的結(jié)果。我們還可以看出,當(dāng)C值更大時(shí),圖像將變得更顯式。C代表從均值或加權(quán)均值中減去值的大小。通過觀察上圖右子圖上下兩幅圖像,我們還可以對比查看相同C值下adaptivethreshold meanc和adaptivethreshold _gaussianc兩種方法生成的不同效果圖。

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會
-
即日-5.15立即報(bào)名>>> 【在線會議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評 >> 【評選啟動】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?