学习笔记(15):一学即懂的计算机视觉(第一季)-程序示例

立即学习:https://edu.csdn.net/course/play/26281/327078?utm_source=blogtoedu

本节内容应该与下一节内容交换一下,本节内容涉及的形态学变换的介绍在下一节才会讲到。

OpenCV边缘检测可以使用基本的边缘检测算子也可以使用形态学变换来实现:

1.边缘检测算子:

   

2.形态学滤波:腐蚀,膨胀,开运算,闭运算,梯度,顶帽,黑帽(底帽),击中击不中变换。

       

import cv2 as cv
import numpy as np

def gauss_noise(image, mean=0, var=0.001):
    image=np.array(image/255, dtype=float)
    noise=np.random.normal(mean, var ** 0.5, image.shape)
    out=image+noise
    if out.min() < 0:
        low_clip = -1.
    else:
        low_clip = 0.
    out=np.clip(out, low_clip, 1.0)
    out=np.uint8(out*255)
    return out
    
def edge_detection():
    filename= "d:/lena.jpg"
    img=cv.imread(filename, 0)
    #img=gauss_noise(img)

    #sobel边缘检测算子
    sobel_y=cv.Sobel(img, cv.CV_16S, 0, 1, ksize=3)
    sobel_x=cv.Sobel(img, cv.CV_16S, 1, 0, ksize=3)
    #拉普拉斯边缘检测算子
    laplacian=cv.Laplacian(img, cv.CV_16S)
    #canny边缘检测,最小阈值50,最大阈值120
    canny=cv.Canny(img, 50, 120)
    
    sobel_x_show=cv.convertScaleAbs(sobel_x)
    sobel_y_show=cv.convertScaleAbs(sobel_y)
    laplacian_show=cv.convertScaleAbs(laplacian)
    
    cv.imshow("image", img)
    cv.imshow("soble_x", sobel_x_show)
    cv.imshow("soble_y", sobel_y_show)
    cv.imshow("laplacian", laplacian_show)
    cv.imshow("canny", canny)

    cv.waitKey()
    cv.destroyAllWindows()
    
def morphology_convert():
    filename= "d:/lena.jpg"
    img=cv.imread(filename, 0)
    nimg=gauss_noise(img)
    
    kernel=cv.getStructuringElement(cv.MORPH_CROSS, (3,3))
    #腐蚀
    eroded=cv.erode(img, kernel)
    #膨胀
    dilated=cv.dilate(img, kernel)
    #先开后闭去噪
    opened=cv.morphologyEx(nimg, cv.MORPH_OPEN, kernel)
    closed=cv.morphologyEx(opened, cv.MORPH_CLOSE, kernel)
        
    #梯度变换
    gradient=cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
    #顶帽变换
    tophat=cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
    #底帽变换
    bottomhat=cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
    #增强
    enhance=img + tophat - bottomhat
    #击中击不中变换
    kernel_hmt=np.array(([0,1,0],[1,-1,1],[0,1,0]), dtype='int')
    hmt=cv.morphologyEx(img, cv.MORPH_HITMISS, kernel_hmt)
    
    cv.imshow("image", img)
    cv.imshow("noised image", nimg)
    cv.imshow("eroded image", eroded)
    cv.imshow("dilated image", dilated)
    cv.imshow("opened", opened)
    cv.imshow("closed", closed)
    
    cv.imshow("gradient image", gradient)
    cv.imshow("tophat image", tophat)
    cv.imshow("bottomhat image", bottomhat)
    cv.imshow("enhance image", enhance)
    cv.imshow("hit or miss image", hmt)

    cv.waitKey()
    cv.destroyAllWindows()
if __name__ == '__main__':
    morphology_convert()

效果如图:

 

 

 

 

 

 

发布了65 篇原创文章 · 获赞 34 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/huanggang982/article/details/104605572