计算机视觉——图像预处理及边缘检测
1.為什么要進行圖像預處理?
\qquad當對圖像進行邊緣、輪廓的檢測時,圖像噪聲會對檢測產生不利影響,并且為了幫助模型專注于一般細節(jié)并獲得更高的準確度,我們需要對圖像進行預處理。
 \qquad預處理的內容有去除噪聲,控制像素值得強度,一般的處理技巧有模糊(Blurring)、閾值(thresholding)、形態(tài)轉換(morphological transformation)等。
2.模糊
\qquad模糊的主要目的是為了降噪,比如當邊緣檢測算法應用于高分辨率的圖像時,會獲得很多我們并不感興趣的內容,這時候我們需要模糊進行降噪。當對圖像進行模糊處理時,需要尋找合適的模糊量,模糊量太少,則有太多噪聲;模糊量太多,會丟失我們需要的數(shù)據(jù)。
 \qquadOpenCV中常用四種模糊的技術:平均模糊、高斯模糊、中值模糊和雙邊濾波模糊。
 \qquad這四種模糊技術的原理相同:使用濾波器(內核),對圖像進行卷積運算。但是各個模糊技術之間使用的濾波器不同,比如平均模糊,首先計算內核區(qū)域下的平均值;然后把平均值替換內核區(qū)域的中心值。當內核區(qū)域變大時,圖像會更模糊。
 \qquad為了驗證kernel區(qū)域越大,圖像越模糊。我們設定當kernel的大小為5×\times× 5,11×\times× 11 , 15×\times× 15對圖像進行卷積運算,然后比較各個圖像的模糊程度。
\qquad運行結果:
 \qquad高斯模糊,高斯模糊的kernel值是由高斯函數(shù)生成,即內核值服從高斯分布。雙邊濾波模糊,具有去除噪音,同時保持邊緣清晰。把四種模糊技術進行對比。
\qquad運行結果:
 
3.閾值
\qquad閾值處理,就是將圖像轉換為二進制圖像。有五種不同的閾值處理方式:二進制,二進制的逆,閾值為零,閾值到零的倒數(shù)和閾值截斷。比較五種不同的閾值處理。
import cv2 import matplotlib.pyplot as plt#讀取圖像,并將圖像矩陣修改為RGB顏色模式 img = cv2.imread('F:/animal.jpg') img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#標題中文顯示設置 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = Falseplt.subplot(231) plt.imshow(img) plt.title("原圖")plt.subplot(232) _, thresh_0 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) plt.imshow(thresh_0) plt.title("二進制")plt.subplot(233) _, thresh_1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) plt.imshow(thresh_1) plt.title("二進制的逆")plt.subplot(234) _, thresh_2 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO) plt.imshow(thresh_2) plt.title("閾值為零")plt.subplot(235) _, thresh_3 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV) plt.imshow(thresh_3) plt.title("閾值到零的倒數(shù)")plt.subplot(236) _, thresh_4 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC) plt.imshow(thresh_4) plt.title("閾值截斷")plt.show()\qquad運行結果:
 
4.形態(tài)轉換
\qquad形態(tài)轉換,通過過濾來處理對象。過濾器的形狀可以為矩形(rectangle),橢圓形(ellipse),十字形(cross)。形態(tài)轉換的技術有:侵蝕,膨脹等。下面以侵蝕形態(tài)轉換為例,比較三種形狀過濾器的效果。
import cv2 import matplotlib.pyplot as plt import numpy as np#讀取圖像,并將圖像矩陣修改為RGB顏色模式 img = cv2.imread('F:/animal.jpg') img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#標題中文顯示設置 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False#原圖 plt.subplot(221) plt.imshow(img) plt.title("原圖")#矩形 plt.subplot(222) kernel_0 = np.ones((9, 9)) img1 = cv2.erode(img, kernel_0, iterations = 3) plt.imshow(img1) plt.title("矩形")#橢圓 plt.subplot(223) kernel_1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9)) img2 = cv2.erode(img,kernel_1,iterations=3) plt.imshow(img2) plt.title("橢圓")#十字形 plt.subplot(224) kernel_2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (9, 9)) img3 = cv2.erode(img,kernel_2,iterations=3) plt.imshow(img3) plt.title("十字形")plt.show()\qquad運行結果:
 
5.邊緣檢測
\qquad使用cv2.Canny()函數(shù)進行邊緣檢測。
import cv2 import matplotlib.pyplot as plt#讀取圖像 img = cv2.imread('F:/dog.jpg') img_color = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#標題中文顯示設置 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = Falseplt.subplot(221) plt.imshow(img_color) plt.title("原圖")plt.subplot(222) canny1 = cv2.Canny(img_gray, 50, 150) plt.imshow(canny1,cmap='gray')plt.subplot(223) canny2 = cv2.Canny(img_gray, 100, 200) plt.imshow(canny2,cmap='gray')plt.subplot(224) canny3 = cv2.Canny(img_gray, 150, 250) plt.imshow(canny3,cmap='gray')plt.show()\qquad運行結果:
 
參考鏈接:Basic Operations on Images
 \qquad \qquadMorphology
 \qquad \qquadDrawing Functions in OpenCV
總結
以上是生活随笔為你收集整理的计算机视觉——图像预处理及边缘检测的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 数据库基础知识——DDL语言
 - 下一篇: 成员变量、局部变量、实例变量、静态变量、