openCV——梯度运算

梯度运算

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
def cvshow(name, ndarray):
    # 第一个参数表示显示窗口的名字,第二个参数表示数据
    cv2.imshow(name, ndarray)
    # 表示等待多久窗口关闭,毫秒单位。0表示按任意键结束
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Sobel算子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCMWkmnZ-1650113054963)(attachment:image.png)]

dst = cv2.Sobel( src, ddepth, dx, dy[,ksize[, scale[, delta[, borderType]]]] )

  • ddepth:代表输出图像的深度
  • dx和dy分别表示水平和竖直方向
  • ksize 代表 Sobel 核的大小。该值为-1 时,则会使用 Scharr 算子进行运算
  • scale 代表计算导数值时所采用的缩放因子,默认情况下该值是 1,是没有缩放的
  • delta 代表加在目标图像 dst 上的值,该值是可选的,默认为 0
  • borderType 代表边界样式
rec = cv2.imread("rectangle.png", cv2.IMREAD_GRAYSCALE)
cvshow("rec", rec)
# Sobel算子获取边缘
rec_sobel_x = cv2.Sobel(rec, -1, 1, 0)
cvshow("sobel_x", rec_sobel_x)

从程序可以看出,当参数 ddepth 的值为-1 时,只得到了内层的两条边界。这是因为,黑色框减去左边的白色像素值为负数,其在显示时被调整为 0,如果处理的图像是 8 位图类型,则在 ddepth
的参数值为-1 时,意味着指定运算结果也是 8 位图类型,那么所有负数会自动截断为 0,发生
信息丢失。为了避免信息丢失,在计算时要先使用更高的数据类型 cv2.CV_64F,再通过取绝
对值将其映射为 cv2.CV_8U(8 位图)类型。所以,通常要将函数 cv2.Sobel()内参数 ddepth 的
值设置为“cv2.CV_64F”。

在 OpenCV 中,使用函数 cv2.convertScaleAbs()对参数取绝对值

dst = cv2.convertScaleAbs( src [, alpha[, beta]] )

  • dst 代表处理结果
  • src 代表原始图像
  • alpha 代表调节系数,该值是可选值,默认为 1
  • beta 代表调节亮度值,该值是默认值,默认为 0
# Sobel算子获取边缘的标准步骤
rec_x = cv2.Sobel(rec, cv2.CV_64F, 1, 0)
rec_x = cv2.convertScaleAbs(rec_x)
rec_y = cv2.Sobel(rec, cv2.CV_64F, 0, 1)
rec_y = cv2.convertScaleAbs(rec_y)
res_sobel = cv2.addWeighted(rec_x, 0.5, rec_y, 0.5, 0)
cvshow("sobel", res_sobel)

Scharr算子

Scharr算子可以看成是sobel算子的改良版

laplacian算子

#不同算子的差异
lena = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(lena,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(lena,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)   
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  

scharrx = cv2.Scharr(lena,cv2.CV_64F,1,0)
scharry = cv2.Scharr(lena,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)   
scharry = cv2.convertScaleAbs(scharry)  
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 

laplacian = cv2.Laplacian(lena,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)   

res = np.hstack((sobelxy,scharrxy,laplacian))
cvshow("res",res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值