Opencv圖像處理方法最全總結(jié)
圖像閾值處理
圖像閾值的處理通過cv2.threshold函數(shù)來進(jìn)行處理,該函數(shù)的具體說明如下所示
ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖
dst: 輸出圖
thresh: 閾值
maxval: 當(dāng)像素值超過了閾值(或者小于閾值,根據(jù)type來決定),所賦予的值
type:二值化操作的類型,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
cv2.THRESH_BINARY 超過閾值部分取maxval(最大值),否則取0
cv2.THRESH_BINARY_INV THRESH_BINARY的反轉(zhuǎn)
cv2.THRESH_TRUNC 大于閾值部分設(shè)為閾值,否則不變
cv2.THRESH_TOZERO 大于閾值部分不改變,否則設(shè)為0
cv2.THRESH_TOZERO_INV THRESH_TOZERO的反轉(zhuǎn)
- 讀取圖像信息并將其轉(zhuǎn)化為灰度圖
import cv2 #opencv讀取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def showimg(name,img): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows() img_dog = cv2.imread('./res/dog.jpg') # 轉(zhuǎn)化為灰度圖 img_gray = cv2.cvtColor(img_dog,cv2.COLOR_BGR2GRAY) img_gray.shape showimg("dog",img_gray)
- 測(cè)試圖像閾值的處理,并在行內(nèi)繪制經(jīng)過圖像閾值處理之后的圖像信息(彩色圖像進(jìn)行處理)
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV) ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC) ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO) ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV) titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV'] images = [img_dog, 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()
圖像平滑處理
首先引出圖像平滑處理的概念 -> 讀入(給出)一張含有多個(gè)圖像噪音的圖片。對(duì)圖像進(jìn)行平滑處理可以簡(jiǎn)單的理解為使用濾波去除圖像中噪音的過程
- 讀入并展示含有噪音的經(jīng)典圖像數(shù)據(jù)
img_n = cv2.imread('./res/lenaNoise.png') showimg('noise',img_n)
濾波可以類比與卷積操作,對(duì)圖像中的像素值進(jìn)行處理
使用均值濾波對(duì)圖像進(jìn)行處理。
cv2.blur(img, (3, 3))
- img輸入圖像
- (3,3)(5,5)處理的區(qū)域大小
# 均值濾波 # 簡(jiǎn)單的平均卷積操作 blur = cv2.blur(img_n, (3, 3)) cv2.imshow('blur', blur) cv2.waitKey(0) cv2.destroyAllWindows()
從而可以看出明顯的平滑處理的樣式
# 方框?yàn)V波 # 基本和均值一樣,可以選擇歸一化(True進(jìn)行平均 False ) box = cv2.boxFilter(img_n,-1,(3,3), normalize=False) cv2.imshow('box', box) cv2.waitKey(0) cv2.destroyAllWindows()
其他使用較多的方式包括了均值濾波和高斯濾波等一些常規(guī)的方法
# 高斯濾波 # 高斯模糊的卷積核里的數(shù)值是滿足高斯分布,相當(dāng)于更重視中間的 aussian = cv2.GaussianBlur(img_n, (5, 5), 1) cv2.imshow('aussian', aussian) cv2.waitKey(0) cv2.destroyAllWindows() #%% # 中值濾波 # 相當(dāng)于用中值代替 median = cv2.medianBlur(img_n, 5) # 中值濾波 cv2.imshow('median', median) cv2.waitKey(0) cv2.destroyAllWindows()
所有的平滑處理結(jié)果進(jìn)行展示
# 展示所有的 res = np.hstack((blur,aussian,median)) #print (res) cv2.imshow('median vs average', res) cv2.waitKey(0) cv2.destroyAllWindows()
圖像形態(tài)學(xué)操作
圖像的形態(tài)學(xué)操作大多處理的是黑白背景的圖片
圖像的腐蝕操作 :(即設(shè)置迭代的次數(shù)和操作的大?。?duì)白色的邊緣區(qū)域來進(jìn)行進(jìn)一步的處理。
dige = cv2.imread('./res/dige.png') cv2.imshow('img', dige) cv2.waitKey(0) cv2.destroyAllWindows()
cv2.erode(dige,kernel,iterations = 2)
- 圖像
- 操作大小
- 迭代次數(shù)
kernel = np.ones((3,3),np.uint8) erosion = cv2.erode(dige,kernel,iterations = 2) cv2.imshow('erosion', erosion) cv2.waitKey(0) cv2.destroyAllWindows()
腐蝕操作的一個(gè)逆操作可以看作是一個(gè)膨脹操作。(使得白色的區(qū)域變大)
在執(zhí)行腐蝕完成之后白色的小區(qū)域雖然去掉了,但是線條的大小變小,因此需要使用膨脹操作
cv2.dilate(erosion,kernel,iterations = 1)
- erosion經(jīng)過腐蝕操作之后的圖像。
kernel = np.ones((3,3),np.uint8) dige_dilate = cv2.dilate(erosion,kernel,iterations = 1) cv2.imshow('dilate', dige_dilate) cv2.waitKey(0) cv2.destroyAllWindows()
完成膨脹操作進(jìn)行擴(kuò)充線條的粗細(xì)。
開運(yùn)算與閉運(yùn)算
開運(yùn)算(cv2.MORPH_OPEN):先腐蝕,再膨脹 閉運(yùn)算(cv2.MORPH_CLOSE):先膨脹,再腐蝕
本質(zhì)就是一個(gè)綜合進(jìn)行處理的過程信息。cv2.morphologyEx()
# 開:先腐蝕,再膨脹 img = cv2.imread('dige.png') kernel = np.ones((5,5),np.uint8) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) cv2.imshow('opening', opening) cv2.waitKey(0) cv2.destroyAllWindows()
# 閉:先膨脹,再腐蝕 img = cv2.imread('dige.png') kernel = np.ones((5,5),np.uint8) closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) cv2.imshow('closing', closing) cv2.waitKey(0) cv2.destroyAllWindows()
梯度運(yùn)算
梯度(cv2.MORPH_GRADIENT)=膨脹-腐蝕:簡(jiǎn)單理解是梯度運(yùn)算是用來篩選圖片的邊界區(qū)域的。
- 水平連接經(jīng)過膨脹和腐蝕的兩個(gè)區(qū)域。
res = np.hstack((dilate,erosion))
# 梯度=膨脹-腐蝕 pie = cv2.imread('./res/pie.png') kernel = np.ones((7,7),np.uint8) dilate = cv2.dilate(pie,kernel,iterations = 5) erosion = cv2.erode(pie,kernel,iterations = 5) res = np.hstack((dilate,erosion)) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()
- 執(zhí)行梯度運(yùn)算來進(jìn)行篩選。
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel) cv2.imshow('gradient', gradient) cv2.waitKey(0) cv2.destroyAllWindows()
總結(jié)
到此這篇關(guān)于Opencv圖像處理方法的文章就介紹到這了,更多相關(guān)Opencv圖像處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
opencv鎖定鼠標(biāo)定位的實(shí)現(xiàn)
本文主要介紹了opencv鎖定鼠標(biāo)定位的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02python循環(huán)神經(jīng)網(wǎng)絡(luò)RNN函數(shù)tf.nn.dynamic_rnn使用
這篇文章主要為大家介紹了python循環(huán)神經(jīng)網(wǎng)絡(luò)RNN的tf.nn.dynamic_rnn使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05解決NameError:name'pip'is not defined使用pip
使用pip時(shí)遇到NameError:name ‘pip’ is not defined錯(cuò)誤通常是由于在Python環(huán)境內(nèi)直接嘗試運(yùn)行pip命令導(dǎo)致的,正確的做法是在Python外部的命令行中運(yùn)行pip命令,這個(gè)錯(cuò)誤提醒我們?cè)谑褂胮ip時(shí),應(yīng)確保在正確的環(huán)境中執(zhí)行相關(guān)命令2024-10-10使用selenium+chromedriver+xpath爬取動(dòng)態(tài)加載信息
這篇文章主要介紹了使用selenium+chromedriver+xpath爬取動(dòng)態(tài)加載信息2022-02-02Python實(shí)現(xiàn)郵件發(fā)送功能的方法詳解
本文將學(xué)會(huì)各種類型的郵件發(fā)送方式,比如普通文本郵件、帶附件的郵件等等,如何通過程序發(fā)送郵件現(xiàn)在我們還不太了解,接下來就會(huì)為大家進(jìn)行詳細(xì)的介紹2022-05-05解決python中的冪函數(shù)、指數(shù)函數(shù)問題
今天小編就為大家分享一篇解決python中的冪函數(shù)、指數(shù)函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11