OpenCV-Python之图像梯度

25 篇文章 6 订阅
14 篇文章 1 订阅
  • Sobel算子对应一阶导数
  • Laplace算子对应二阶导数

Sobel算子(Schar)

import cv2 as cv
def sobel_demo(image):
    grad_x = cv.Sobel(image, cv.CV_32F, 1, 0) # 使用CV_32F防止数据溢出
    grad_y = cv.Sobel(image, cv.CV_32F, 0, 1)
    gradx = cv.convertScaleAbs(grad_x) # 取绝对值转到8位
    grady = cv.convertScaleAbs(grad_y)
    cv.imshow('gradient_x', gradx)
    cv.imshow('gradient_y', grady)
    # 合并x, y两个梯度
    addImage = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
    cv.imshow('add image', addImage)



src = cv.imread('./data/lena.jpg', 1)
sobel_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
仔细观察三张图不难发现,X方向梯度在Y方向上边缘较为清晰,而Y方向梯度在X方向上边缘较为清晰,合并后的图像则综合了两张图的特征。如果边缘轮廓不清晰或不理想可以考虑用Scarr来计算,结果如下:
在这里插入图片描述

Laplace算子

def Laplace_demo(image):
    dst = cv.Laplacian(image, cv.CV_32F)
    laps = cv.convertScaleAbs(dst)
    cv.imshow('Laplace image', laps)

src = cv.imread('./data/lena.jpg', 1)
Laplace_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

借助filter2D()函数自定义掩模计算Laplace算法
def Laplace_demo(image):
    # dst = cv.Laplacian(image, cv.CV_32F)
    # laps = cv.convertScaleAbs(dst)
    kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
    dst = cv.filter2D(image, cv.CV_32F, kernel=kernel)
    laps = cv.convertScaleAbs(dst)
    cv.imshow('Laplace image', laps)

src = cv.imread('./data/lena.jpg', 1)
Laplace_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
几乎上上图一样,改变核为[[1,1,1],[1,-8,1],[1,1,1]]再观察
在这里插入图片描述
图像增强了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子孤岛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值