opencv学习-边缘检测

  1. 图像的边缘指的是灰度值发生急剧变化的位置
  2. 边缘,在某种程度上它不随光照和视角的变化而变化
  3. 边缘检测的目的是制作一个线图,在不会损害理解图像内容的情况下,同时又大大减少图像的数据量。提供对图像数据的合适概述

边缘检测大多是通过基于方向导数掩码(梯度方向导数)求卷积的方法。

Sobel算子

Sobel算子是在一个坐标轴方向上进行非归一化的高斯平滑,在另一个坐标轴方向上进行差分处理。

API

import cv2

def sobel_demo(image):
    grad_x=cv2.Sobel(image,cv2.CV_32F,1,0)
    grad_y=cv2.Sobel(image,cv2.CV_32F,0,1)
    cv2.imshow("grad_x",grad_x)
    cv2.imshow("grad_y",grad_y)
    
    gradxy =cv2.addWeighted(grad_x,0.5,grad_y,0.5,0)
    cv2.imshow("grad",gradxy)

src = cv2.imread(r'C:\Users\h\Desktop\image\lena.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow("src",src)
sobel_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

Sobel

Scharr算子

import cv2

def scharr_demo(image):
    grad_x=cv2.Scharr(image,cv2.CV_32F,1,0)
    grad_y=cv2.Scharr(image,cv2.CV_32F,0,1)
#    cv2.imshow("grad_x",grad_x)
#    cv2.imshow("grad_y",grad_y)
    
    gradxy =cv2.addWeighted(grad_x,0.5,grad_y,0.5,0)
    cv2.imshow("grad",gradxy)

src = cv2.imread(r'C:\Users\h\Desktop\image\lena.jpg',cv2.IMREAD_ANYCOLOR)
cv2.imshow("src",src)
scharr_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果可能比Soble算子更强烈一些

Laplacian算子

利用二维函数的拉普拉斯变换

import cv2
import numpy as np

def laplacian_demo(image):
#    dst = cv2.Laplacian(image,cv2.CV_32F)
#    lpls = cv2.convertScaleAbs(dst)
#    cv2.imshow("lpls",lpls)
    
    kernel = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]],np.float32)
    dst = cv2.filter2D(image,cv2.CV_32F,kernel=kernel)
    lpls=lpls = cv2.convertScaleAbs(dst)
    cv2.imshow("lpls",lpls)

src = cv2.imread(r'C:\Users\h\Desktop\image\lena.jpg',cv2.IMREAD_GRAYSCALE)

cv2.imshow("src",src)
laplacian_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

Canny算子

Canny边缘检测提出了:

  • 基于边缘梯度方向的非极大值抑制
  • 双阈值的滞后阈值处理
import cv2 as cv
import numpy as np

def edge_demo(image):
    blurred = cv.GaussianBlur(image,(3,3),0)
    gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
#    xgrad=cv.Sobel(gray,cv.CV_16SC1,1,0)
#    ygrad=cv.Sobel(gray,cv.CV_16SC1,0,1)
   # edge_output = cv.Canny(xgrad,ygrad,50,150)
    edge_output = cv.Canny(gray,50,150)
    cv.imshow("Canny_edge",edge_output)
    
    dst=cv.bitwise_and(image,image,mask=edge_output)
    cv.imshow("Color_edge",dst)
    
#    

src = cv.imread(r'C:\Users\h\Desktop\image\lena.jpg')

cv.imshow("src",src)
edge_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

Canny

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值