Opencv圖像處理方法最全總結(jié)
圖像閾值處理
圖像閾值的處理通過cv2.threshold函數(shù)來進行處理,該函數(shù)的具體說明如下所示
ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖
dst: 輸出圖
thresh: 閾值
maxval: 當像素值超過了閾值(或者小于閾值,根據(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)

- 測試圖像閾值的處理,并在行內(nèi)繪制經(jīng)過圖像閾值處理之后的圖像信息(彩色圖像進行處理)
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()

圖像平滑處理
首先引出圖像平滑處理的概念 -> 讀入(給出)一張含有多個圖像噪音的圖片。對圖像進行平滑處理可以簡單的理解為使用濾波去除圖像中噪音的過程
- 讀入并展示含有噪音的經(jīng)典圖像數(shù)據(jù)
img_n = cv2.imread('./res/lenaNoise.png')
showimg('noise',img_n)

濾波可以類比與卷積操作,對圖像中的像素值進行處理
使用均值濾波對圖像進行處理。
cv2.blur(img, (3, 3))
- img輸入圖像
- (3,3)(5,5)處理的區(qū)域大小
# 均值濾波
# 簡單的平均卷積操作
blur = cv2.blur(img_n, (3, 3))
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
從而可以看出明顯的平滑處理的樣式

# 方框濾波
# 基本和均值一樣,可以選擇歸一化(True進行平均 False )
box = cv2.boxFilter(img_n,-1,(3,3), normalize=False)
cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
其他使用較多的方式包括了均值濾波和高斯濾波等一些常規(guī)的方法
# 高斯濾波
# 高斯模糊的卷積核里的數(shù)值是滿足高斯分布,相當于更重視中間的
aussian = cv2.GaussianBlur(img_n, (5, 5), 1)
cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
#%%
# 中值濾波
# 相當于用中值代替
median = cv2.medianBlur(img_n, 5) # 中值濾波
cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()
所有的平滑處理結(jié)果進行展示
# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

圖像形態(tài)學操作
圖像的形態(tài)學操作大多處理的是黑白背景的圖片
圖像的腐蝕操作 :(即設(shè)置迭代的次數(shù)和操作的大?。Π咨倪吘墔^(qū)域來進行進一步的處理。

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()

腐蝕操作的一個逆操作可以看作是一個膨脹操作。(使得白色的區(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()

完成膨脹操作進行擴充線條的粗細。
開運算與閉運算
開運算(cv2.MORPH_OPEN):先腐蝕,再膨脹 閉運算(cv2.MORPH_CLOSE):先膨脹,再腐蝕
本質(zhì)就是一個綜合進行處理的過程信息。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()
梯度運算
梯度(cv2.MORPH_GRADIENT)=膨脹-腐蝕:簡單理解是梯度運算是用來篩選圖片的邊界區(qū)域的。
- 水平連接經(jīng)過膨脹和腐蝕的兩個區(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í)行梯度運算來進行篩選。
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python循環(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使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
解決NameError:name'pip'is not defined使用pip
使用pip時遇到NameError:name ‘pip’ is not defined錯誤通常是由于在Python環(huán)境內(nèi)直接嘗試運行pip命令導致的,正確的做法是在Python外部的命令行中運行pip命令,這個錯誤提醒我們在使用pip時,應確保在正確的環(huán)境中執(zhí)行相關(guān)命令2024-10-10
使用selenium+chromedriver+xpath爬取動態(tài)加載信息
這篇文章主要介紹了使用selenium+chromedriver+xpath爬取動態(tài)加載信息2022-02-02
解決python中的冪函數(shù)、指數(shù)函數(shù)問題
今天小編就為大家分享一篇解決python中的冪函數(shù)、指數(shù)函數(shù)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11

