日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python-opencv 形态学

發(fā)布時(shí)間:2023/11/27 生活经验 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python-opencv 形态学 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

五、形態(tài)學(xué)運(yùn)算 檢測邊和 角點(diǎn)

?形態(tài)學(xué)算子檢測圖像中的邊緣和拐角(實(shí)際用:Canny或Harris等算法)

5.1 檢測邊緣

?形態(tài)學(xué)檢測邊緣的原理:在膨脹時(shí),圖像中的物體會想周圍“擴(kuò)張”腐蝕時(shí),圖像中的物體會“收縮”。由于這兩幅圖像其變化的區(qū)域只發(fā)生在邊緣。所以這時(shí)將兩幅圖像相減,得到的就是圖像中物體的邊緣。

import cv2
original_img = cv2.imread('image/1.jpg',0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
dilate_img = cv2.dilate(original_img, kernel)
erode_img = cv2.erode(original_img, kernel)
"""
我選了一張較好的圖片,有的圖片要去噪(高斯模糊)
將兩幅圖像相減獲得邊;cv2.absdiff參數(shù):(膨脹后的圖像,腐蝕后的圖像)
上面得到的結(jié)果是灰度圖,將其二值化以便觀察結(jié)果
反色,對二值圖每個(gè)像素取反
"""
absdiff_img = cv2.absdiff(dilate_img,erode_img);
retval, threshold_img = cv2.threshold(absdiff_img, 40, 255, cv2.THRESH_BINARY);
result = cv2.bitwise_not(threshold_img);
cv2.imshow("rlufei",original_img)
cv2.imshow("dilate_img",dilate_img)
cv2.imshow("erode_img",erode_img)
cv2.imshow("absdiff_img",absdiff_img)
cv2.imshow("threshold_img",threshold_img)
cv2.imshow("result",result)
cv2.waitKey(0)
cv2.destroyAllWindows()

?

5.2檢測拐角

拐角的檢測的原理:先用十字形的結(jié)構(gòu)元素膨脹像素,這種情況下只會在邊緣處“擴(kuò)張”,角點(diǎn)不發(fā)生變化。接著用菱形的結(jié)構(gòu)元素腐蝕原圖像,導(dǎo)致只有在拐角處才會“收縮”,而直線邊緣都未發(fā)生變化。第二步是用X形膨脹原圖像,角點(diǎn)膨脹的比邊要多。這樣第二次用方塊腐蝕時(shí),角點(diǎn)恢復(fù)原狀,而邊要腐蝕的更多。所以當(dāng)兩幅圖像相減時(shí),只保留了拐角處。
?

import cv2
image = cv2.imread('image/1.jpg',0)
original_image = image.copy()
#構(gòu)造5×5的結(jié)構(gòu)元素,分別為十字形、菱形、方形和X型
cross = cv2.getStructuringElement(cv2.MORPH_CROSS,(5, 5))
diamond = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
diamond[0, 0] = 0
diamond[0, 1] = 0
diamond[1, 0] = 0
diamond[4, 4] = 0
diamond[4, 3] = 0
diamond[3, 4] = 0
diamond[4, 0] = 0
diamond[4, 1] = 0
diamond[3, 0] = 0
diamond[0, 3] = 0
diamond[0, 4] = 0
diamond[1, 4] = 0
square = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))  #構(gòu)造方形結(jié)構(gòu)元素
x = cv2.getStructuringElement(cv2.MORPH_CROSS,(5, 5))
dilate_cross_img = cv2.dilate(image,cross)                #使用cross膨脹圖像
erode_diamond_img = cv2.erode(dilate_cross_img, diamond)  #使用菱形腐蝕圖像
dilate_x_img = cv2.dilate(image, x)                       #使用X膨脹原圖像
erode_square_img = cv2.erode(dilate_x_img,square)         #使用方形腐蝕圖像
result = cv2.absdiff(erode_square_img, erode_diamond_img)          #將兩幅閉運(yùn)算的圖像相減獲得角
retval, result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY) #使用閾值獲得二值圖#在原圖上用半徑為5的圓圈將點(diǎn)標(biāo)出。
for j in range(result.size):y = int(j / result.shape[0])x = int(j % result.shape[0])if result[x, y] == 255:                                        #result[] 只能傳入整型cv2.circle(image,(y,x),5,(255,0,0))
cv2.imshow("original_image", original_image)
cv2.imshow("Result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、禮帽/頂帽,黑帽 算法

該算法可以圖像識別的預(yù)處理,用于圖像二值化后去除孤立點(diǎn),如下圖所示?

import cv2
original_img = cv2.imread('image/1.jpg',0)
gray_img = cv2.resize(original_img,None,fx=0.8, fy=0.8, interpolation = cv2.INTER_CUBIC) #圖形太大了縮小一點(diǎn)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))              #定義矩形結(jié)構(gòu)元素(核大小為3效果好)
TOPHAT_img = cv2.morphologyEx(gray_img, cv2.MORPH_TOPHAT, kernel)     #頂帽運(yùn)算
BLACKHAT_img = cv2.morphologyEx(gray_img, cv2.MORPH_BLACKHAT, kernel) #黒帽運(yùn)算
bitwiseXor_gray = cv2.bitwise_xor(gray_img,TOPHAT_img)
#顯示如下腐蝕后的圖像
cv2.imshow("gray_img", gray_img)
cv2.imshow("TOPHAT_img", TOPHAT_img)
cv2.imshow("BLACKHAT_img", BLACKHAT_img)
cv2.imshow("bitwiseXor_gray",bitwiseXor_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

?

三、開運(yùn)算和閉運(yùn)算

開運(yùn)算和閉運(yùn)算就是將腐蝕和膨脹按照一定的次序進(jìn)行處理。? 運(yùn)算不可逆,即先開后閉并不能得到原先的圖像。
為了獲取圖像中的主要對象:對一副二值圖連續(xù)使用閉運(yùn)算和開運(yùn)算,或者消除圖像中的噪聲,也可以對圖像先用開運(yùn)算后用閉運(yùn)算,不過這樣也會消除一些破碎的對象。

開運(yùn)算:先腐蝕后膨脹,用于移除由圖像噪音形成的斑點(diǎn)

閉運(yùn)算:先膨脹后腐蝕,用來連接被誤分為許多小塊的對象

"""
cv2.morphologyEx(src,      # 輸入圖片op,       # 需要處理類型的函數(shù):(cv2.MORPH_OPEN,cv2.MORPH_CLOSE,cv2.MORPH_GRADIENT)kernel,   # 卷積核大小dst=None, anchor=None, iterations=None,     #迭代次數(shù),默認(rèn)1次borderType=None, borderValue=None)
"""
import cv2
import numpy as np
original_img = cv2.imread('original_img.png',0)
gray_res = cv2.resize(original_img,None,fx=0.8,fy=0.8,interpolation = cv2.INTER_CUBIC)                #圖形太大了縮小一點(diǎn)
# B, G, img = cv2.split(res)
# _,RedThresh = cv2.threshold(img,160,255,cv2.THRESH_BINARY)     #設(shè)定紅色通道閾值160(閾值影響開閉運(yùn)算效果)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))         #定義矩形結(jié)構(gòu)元素closed1 = cv2.morphologyEx(gray_res, cv2.MORPH_CLOSE, kernel,iterations=1)    #閉運(yùn)算1
closed2 = cv2.morphologyEx(gray_res, cv2.MORPH_CLOSE, kernel,iterations=3)    #閉運(yùn)算2
opened1 = cv2.morphologyEx(gray_res, cv2.MORPH_OPEN, kernel,iterations=1)     #開運(yùn)算1
opened2 = cv2.morphologyEx(gray_res, cv2.MORPH_OPEN, kernel,iterations=3)     #開運(yùn)算2
gradient = cv2.morphologyEx(gray_res, cv2.MORPH_GRADIENT, kernel)             #梯度#顯示如下腐蝕后的圖像
cv2.imshow("gray_res", gray_res)
cv2.imshow("Close1",closed1)
cv2.imshow("Close2",closed2)
cv2.imshow("Open1", opened1)
cv2.imshow("Open2", opened2)
cv2.imshow("gradient", gradient)cv2.waitKey(0)
cv2.destroyAllWindows()

?

二、腐蝕和膨脹

腐蝕:腐蝕會把物體的邊界腐蝕掉,卷積核沿著圖象滑動,如果卷積核對應(yīng)的原圖的所有像素值為1,那么中心元素就保持原來的值,其余部分變?yōu)榱恪?span style="color:#f33b45;">主要應(yīng)用在去除白噪聲,也可以斷開連在一起的物體

膨脹:卷積核所對應(yīng)的原圖像的像素值只要有一個(gè)是1,中心像素值就是1。一般在除噪是,先腐蝕再膨脹開運(yùn)算,因?yàn)楦g在去除白噪聲的時(shí)候也會使圖像縮小,所以我們之后要進(jìn)行膨脹。當(dāng)然也可以用來將兩者物體連通。

import cv2
import numpy as np
import math
import matplotlib.pyplot as plttargetImg = cv2.imread('image/1.jpg')
kernel_4 = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
HSV = cv2.cvtColor(targetImg, cv2.COLOR_BGR2HSV)  # 把BGR圖像轉(zhuǎn)換為HSV格式
Lower = np.array([0, 3, 5])  # 要識別顏色-紅色的下限    ## 0 5 5 10 255 255
Upper = np.array([10, 255, 255])  # 要識別的顏色-紅色的上限# mask是把HSV圖片中在顏色范圍內(nèi)的區(qū)域變成白色,其他區(qū)域變成黑色
mask = cv2.inRange(HSV, Lower, Upper)
erosion = cv2.erode(mask, kernel_4, iterations=1)
erosion = cv2.erode(erosion, kernel_4, iterations=1)
dilation = cv2.dilate(erosion, kernel_4, iterations=1)
dilation = cv2.dilate(dilation, kernel_4, iterations=1)cv2.imshow("img", targetImg)
cv2.imshow("mask", mask)
cv2.imshow("target", target)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.waitKey()
# cv2.imshow("cv_cut_img_circle", cv_cut_img_circle)
# return cropped

一、定義結(jié)構(gòu)元素

形態(tài)學(xué)處理的核心就是定義結(jié)構(gòu)元素,在OpenCV-Python中,可以使用其自帶的getStructuringElement函數(shù),也可以直接使用NumPy的ndarray來定義一個(gè)結(jié)構(gòu)元素。

(形象圖如下:)

如下代碼:為上圖的十字形結(jié)構(gòu)
當(dāng)然還可以定義橢圓/矩形等:
橢圓:cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
矩形:cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
print("elemrnt":element )
------------------------------------------------
import numpy as np
NpKernel = np.uint8(np.zeros((5,5)))
for i in range(5):NpKernel[2, i] = 1NpKernel[i, 2] = 1
print("NpKernel ",NpKernel )上述結(jié)果輸出(相同):
array([[0, 0, 1, 0, 0],[0, 0, 1, 0, 0],[1, 1, 1, 1, 1],[0, 0, 1, 0, 0],[0, 0, 1, 0, 0]], dtype=uint8)

參考書籍:

《opencv基礎(chǔ)開發(fā)教程?》

參考blog:

https://blog.csdn.net/sunny2038/article/details/9137759
https://blog.csdn.net/on2way/article/details/46850813

https://blog.csdn.net/wsp_1138886114/article/details/82917661

?

?

總結(jié)

以上是生活随笔為你收集整理的python-opencv 形态学的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。