環(huán)境配置地址
圖像顯示
import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
img=cv2.imread('cat.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_gray.shape
cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
轉(zhuǎn)hsv圖像
顏色表示為三個(gè)組成部分:色調(diào)(Hue)、飽和度(Saturation)和亮度(Value)。常用于圖像處理中,因?yàn)樗试S調(diào)整顏色的感知特性,如色彩和亮度,這些在RGB顏色模型中不那么直觀。
HSV模型特別適用于任務(wù)如圖像分割和對(duì)象追蹤,因?yàn)樗梢愿玫靥幚砉庹兆兓挠绊憽?/p>
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
圖像閾值
ret, dst = cv2.threshold(src, thresh, maxval, type)
-
src: 輸入圖,只能輸入單通道圖像,通常來(lái)說(shuō)為灰度圖
-
dst: 輸出圖
-
thresh: 閾值
-
maxval: 當(dāng)像素值超過(guò)了閾值(或者小于閾值,根據(jù)type來(lái)決定),所賦予的值
-
type:二值化操作的類型,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
-
cv2.THRESH_BINARY 超過(guò)閾值部分取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)
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, 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()
濾波操作
# 均值濾波
# 簡(jiǎn)單的平均卷積操作
blur = cv2.blur(img, (3, 3))
簡(jiǎn)單濾波
blur = cv2.blur(img, (3, 3))
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
局部平均濾波
cv2.boxFilter
用于對(duì)圖像進(jìn)行框?yàn)V波處理,也就是局部平均濾波。函數(shù)會(huì)計(jì)算圖像中每個(gè)像素的鄰域像素的平均值,并用這個(gè)平均值替換中心像素。這種濾波方法可以用于去噪和圖像平滑處理。
這里是使用 cv2.boxFilter
的基本語(yǔ)法:
dst = cv2.boxFilter(src, ddepth, ksize, anchor=(-1, -1), normalize=True, borderType=cv2.BORDER_DEFAULT)
-
src
: 輸入圖像。 -
ddepth
: 輸出圖像的所需深度(數(shù)據(jù)類型),如果為-1
,則輸出和輸入有相同的深度。 -
ksize
: 核的大小,表示濾波器窗口的寬度和高度。 -
anchor
: 核的錨點(diǎn)位置,默認(rèn)值為核中心。 -
normalize
: 如果設(shè)置為True
,則函數(shù)計(jì)算像素的平均值;如果為False
,則進(jìn)行求和(可能會(huì)導(dǎo)致數(shù)值溢出)。 -
borderType
: 邊界像素的插值方式。
這種濾波器對(duì)于簡(jiǎn)單的圖像平滑效果較好,但可能不適用于需要保留邊緣信息的應(yīng)用場(chǎng)景。
box = cv2.boxFilter(img,-1,(3,3), normalize=True)
cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方框?yàn)V波
# 基本和均值一樣,可以選擇歸一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)
cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
中值濾波
cv2.medianBlur
OpenCV 庫(kù)中用于實(shí)現(xiàn)中值濾波的函數(shù)。中值濾波是一種非線性濾波技術(shù),通常用于去除圖像中的椒鹽噪聲(即隨機(jī)出現(xiàn)的黑點(diǎn)和白點(diǎn)噪聲),同時(shí)保持圖像邊緣的清晰度。
中值濾波的原理是用圖像中每個(gè)像素點(diǎn)的鄰域像素的中值來(lái)替換該像素點(diǎn)的值。這種方法特別有效于去除噪聲點(diǎn),因?yàn)樵肼朁c(diǎn)通常會(huì)在其像素值上與周圍像素差異很大。
下面是使用 cv2.medianBlur
的基本語(yǔ)法:
dst = cv2.medianBlur(src, ksize)
-
src
: 輸入圖像。 -
ksize
: 濾波器的大小,它是一個(gè)大于 1 的奇數(shù),表示濾波器窗口的寬度和高度。在這個(gè)例子中,ksize
是 5,所以濾波窗口為 5x5。
中值濾波特別適用于去除圖像的椒鹽噪聲,而不會(huì)使圖像邊緣過(guò)分模糊,因此它在圖像預(yù)處理中非常有用。
# 中值濾波
# 相當(dāng)于用中值代替
median = cv2.medianBlur(img, 5) # 中值濾波
cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()
高斯濾波
cv2.GaussianBlur
是 OpenCV 庫(kù)中用于實(shí)現(xiàn)高斯模糊的函數(shù)。高斯模糊是一種圖像濾波技術(shù),用于減少圖像的細(xì)節(jié)和噪聲,通過(guò)這種方式可以在圖像處理中實(shí)現(xiàn)去噪和平滑效果。
高斯模糊的工作原理是每個(gè)像素點(diǎn)的值被替換為其周圍像素的加權(quán)平均值,權(quán)重由高斯函數(shù)決定,高斯函數(shù)以當(dāng)前像素為中心,且其形狀由標(biāo)準(zhǔn)差σ控制。
以下是使用 cv2.GaussianBlur
函數(shù)的基本語(yǔ)法:
dst = cv2.GaussianBlur(src, ksize, sigmaX)
-
src
: 輸入圖像。 -
ksize
: 濾波器的大小,必須是正數(shù)和奇數(shù)。在這個(gè)例子中,ksize
是 (5, 5),表示濾波器窗口的寬度為 5,高度也為 5。 -
sigmaX
: 高斯核的標(biāo)準(zhǔn)差在 X 方向上。在此例中為 1。如果sigmaX
為 0,它將從ksize
計(jì)算得出。
高斯模糊被廣泛用于圖像處理中的邊緣平滑和噪聲減少,其效果較為自然。
# 高斯濾波
# 高斯模糊的卷積核里的數(shù)值是滿足高斯分布,相當(dāng)于更重視中間的
aussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
均值,中值,高斯濾波對(duì)比
# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
形態(tài)學(xué)操作
原圖
腐蝕操操作
cv2.erode
是 OpenCV 庫(kù)中用于執(zhí)行圖像的腐蝕操作的函數(shù)。腐蝕是一種圖像處理技術(shù),通常用于減小圖像中的前景對(duì)象。它主要用于去除小的白色噪點(diǎn)、分離兩個(gè)連接在一起的對(duì)象等。
在腐蝕操作中,將一個(gè)結(jié)構(gòu)元素(kernel)滑動(dòng)過(guò)原始圖像(src),只有當(dāng)結(jié)構(gòu)元素內(nèi)的所有像素值都為 1 時(shí),原始圖像的中心像素才會(huì)被保留,否則該像素將被抹去(設(shè)為 0)。這樣,只有當(dāng)前景對(duì)象的區(qū)域足夠大,才能在腐蝕操作后仍然存在。
cv2.erode
的基本語(yǔ)法如下:
dst = cv2.erode(src, kernel, iterations=1)
-
src
: 輸入圖像。 -
kernel
: 用于腐蝕操作的結(jié)構(gòu)元素。可以使用cv2.getStructuringElement
函數(shù)定義不同形狀的結(jié)構(gòu)元素。 -
iterations
: 腐蝕操作的次數(shù)。在此例中,腐蝕操作執(zhí)行一次。
此函數(shù)通常用于圖像預(yù)處理,如去除細(xì)小噪聲和分隔接觸物體等,使圖像的結(jié)構(gòu)特征更加明顯。
img = cv2.imread('images/dige.png')
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
不同腐蝕次數(shù)下情況對(duì)比
kernel = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨脹操作
cv2.dilate
是 OpenCV 庫(kù)中用于執(zhí)行圖像的膨脹操作的函數(shù)。膨脹是一種圖像處理技術(shù),通常用于增加圖像中前景對(duì)象的大小。它主要用于填補(bǔ)前景物體中的小洞、連接鄰近的對(duì)象等。
在膨脹操作中,將一個(gè)結(jié)構(gòu)元素(kernel)滑動(dòng)過(guò)原始圖像(src),只要結(jié)構(gòu)元素與原始圖像的任何一個(gè)像素值相交(即至少一個(gè)為 1),原始圖像的中心像素就會(huì)被設(shè)為 1。這樣,前景對(duì)象在膨脹后通常會(huì)變得更大。
cv2.dilate
的基本語(yǔ)法如下:
dst = cv2.dilate(src, kernel, iterations=1)
-
src
: 輸入圖像。 -
kernel
: 用于膨脹操作的結(jié)構(gòu)元素??梢允褂?cv2.getStructuringElement
函數(shù)定義不同形狀的結(jié)構(gòu)元素。 -
iterations
: 膨脹操作的次數(shù)。在此例中,膨脹操作執(zhí)行一次。
此函數(shù)通常與腐蝕操作結(jié)合使用,在去除噪聲的同時(shí)保持物體的尺寸和形狀,或用于填充物體內(nèi)部的小孔和縫隙。
img = cv2.imread('images/dige.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
kernel = np.ones((3,3),np.uint8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)
# 腐蝕結(jié)果
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 膨脹結(jié)果
kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨脹前
膨脹后
不同膨脹結(jié)果顯示
pie = cv2.imread('images/pie.png')
kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
開運(yùn)算
開運(yùn)算(Opening)和閉運(yùn)算(Closing)是圖像處理中常用的形態(tài)學(xué)操作,用于去除小對(duì)象、平滑邊界,同時(shí)保持圖像的基本形狀不變。這兩種操作都使用 cv2.morphologyEx
函數(shù)實(shí)現(xiàn),但具體的行為取決于所使用的特定操作類型。
開運(yùn)算(Opening)
開運(yùn)算首先進(jìn)行腐蝕操作,然后進(jìn)行膨脹操作。這個(gè)順序很重要,因?yàn)槭紫韧ㄟ^(guò)腐蝕去掉小的噪聲點(diǎn),然后通過(guò)膨脹恢復(fù)腐蝕的對(duì)象的大小。它常用于去除小的白噪聲(前景噪聲)。
在 OpenCV 中,開運(yùn)算可以通過(guò)下面的代碼實(shí)現(xiàn):
opened_img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
-
img
: 原始圖像。 -
cv2.MORPH_OPEN
: 指定使用開運(yùn)算。 -
kernel
: 結(jié)構(gòu)元素,定義了操作的性質(zhì)。
閉運(yùn)算(Closing)
閉運(yùn)算先進(jìn)行膨脹操作,后進(jìn)行腐蝕操作。這種操作順序用于填充前景物體內(nèi)部的小洞,或小黑點(diǎn),同時(shí)可以連接靠近的對(duì)象。閉運(yùn)算常用于關(guān)閉前景物體中的小孔和縫隙。
在 OpenCV 中,閉運(yùn)算可以通過(guò)下面的代碼實(shí)現(xiàn):
closed_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
-
img
: 原始圖像。 -
cv2.MORPH_CLOSE
: 指定使用閉運(yùn)算。 -
kernel
: 結(jié)構(gòu)元素,定義了操作的性質(zhì)。
這兩種操作非常適用于圖像預(yù)處理,如在進(jìn)行目標(biāo)檢測(cè)和輪廓分析之前,用于改善圖像的質(zhì)量。
# 開:先腐蝕,再膨脹
img = cv2.imread('images/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()
閉運(yùn)算
梯度運(yùn)算
cv2.morphologyEx
函數(shù)在OpenCV中用于執(zhí)行形態(tài)學(xué)操作,其中cv2.MORPH_GRADIENT
是指定的操作類型之一,代表形態(tài)學(xué)梯度。
形態(tài)學(xué)梯度的原理基于圖像膨脹和腐蝕的概念。簡(jiǎn)單來(lái)說(shuō):
- 膨脹操作會(huì)擴(kuò)大圖像中的亮區(qū)域,通過(guò)用結(jié)構(gòu)元素探測(cè)并取代中心像素的最大值來(lái)實(shí)現(xiàn)。
- 腐蝕操作會(huì)縮小圖像中的亮區(qū)域,通過(guò)用結(jié)構(gòu)元素探測(cè)并取代中心像素的最小值來(lái)實(shí)現(xiàn)。
梯度操作則計(jì)算膨脹圖像和腐蝕圖像之間的差異。這種差異突出了圖像中的高亮邊緣,這是因?yàn)檫吘壐浇南袼卦谂蛎洉r(shí)會(huì)增加其亮度,而在腐蝕時(shí)亮度會(huì)減少。因此,梯度操作能有效地捕捉到物體的邊界和紋理變化,這對(duì)于圖像分析和處理中的邊緣檢測(cè)等應(yīng)用非常有用。
在代碼中,kernel
參數(shù)是一個(gè)結(jié)構(gòu)元素,定義了膨脹和腐蝕操作的形狀和大小,影響最終梯度的計(jì)算結(jié)果。
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
禮帽操作
頂帽操作,也稱為“白帽”操作,是一種形態(tài)學(xué)變換,主要用于突出比鄰近區(qū)域亮的小對(duì)象或細(xì)節(jié)。它通過(guò)原始圖像與開運(yùn)算結(jié)果的差值來(lái)實(shí)現(xiàn):
- 開運(yùn)算:先執(zhí)行腐蝕操作,然后進(jìn)行膨脹。這個(gè)過(guò)程平滑了圖像的外部邊界,斷開了狹窄的連接并消除了細(xì)小的突出部分。
- 頂帽操作:計(jì)算原始圖像與開運(yùn)算結(jié)果的差值。這個(gè)差值揭示了那些在開運(yùn)算中被移除的亮部分,因此頂帽操作能夠突出顯示圖像中比周圍區(qū)域亮的小物體或細(xì)節(jié)。
cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
中的kernel
參數(shù)定義了進(jìn)行腐蝕和膨脹時(shí)使用的結(jié)構(gòu)元素的形狀和大小,從而影響操作的具體效果。頂帽操作常用于增強(qiáng)圖像中的亮區(qū)域或用于提取具有特定形狀特征的物體。
#禮帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
黑帽
黑帽操作,也稱為“黑帽”操作,是一種形態(tài)學(xué)變換,主要用于突出比鄰近區(qū)域暗的小對(duì)象或細(xì)節(jié)。它通過(guò)閉運(yùn)算結(jié)果與原始圖像的差值來(lái)實(shí)現(xiàn):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-855747.html
- 閉運(yùn)算:先進(jìn)行膨脹操作,然后執(zhí)行腐蝕。這個(gè)過(guò)程有助于填充前景物體中的小洞,連接鄰近的對(duì)象,并保持前景物體的總體形狀。
-
黑帽操作:計(jì)算閉運(yùn)算的結(jié)果與原始圖像的差值。這個(gè)差值揭示了那些在閉運(yùn)算中新增的暗部分,因此黑帽操作能夠突出顯示圖像中比周圍區(qū)域暗的小物體或細(xì)節(jié)。
cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
中的kernel
參數(shù)定義了進(jìn)行膨脹和腐蝕時(shí)使用的結(jié)構(gòu)元素的形狀和大小,從而影響操作的具體效果。黑帽操作常用于分析圖像中的暗區(qū)域或檢測(cè)亮背景中的暗物體。
#黑帽
img = cv2.imread('dige.png')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-855747.html
到了這里,關(guān)于OpenCV基本圖像處理操作(一)——圖像基本操作與形態(tài)學(xué)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!