python + opencv图像处理(十八)——图像梯度

mac2024-03-09  27

一阶导数与Soble算子 二阶导数与拉普拉斯算子 二阶导数:在二阶导数的时候,最大变化出的值为零即边缘是零值(根据此理论就可以提取边缘)。

from matplotlib import pyplot as plt from cv2 import cv2 as cv import numpy as np #图像梯度:sobel算子 def sobel_image(image): grad_x = cv.Sobel(image, cv.CV_32F, 1, 0)#x方向导数 grad_y = cv.Sobel(image, cv.CV_32F, 0, 1)#y方向导数 gradx = cv.convertScaleAbs(grad_x) grady = cv.convertScaleAbs(grad_y) cv.imshow("X_sob", gradx)#颜色变化在水平分层 cv.imshow("Y_sob", grady)#颜色变化在垂直分层 gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)#合起来 cv.imshow("xy_sob", gradxy) #图像梯度:scharr算子:增强边缘 # Scharr 是 sobel 算子的增强版本,对噪声比较敏感 def scharr_image(image): grad_x = cv.Scharr(image, cv.CV_32F, 1, 0)#x方向导数 grad_y = cv.Scharr(image, cv.CV_32F, 0, 1)#y方向导数 gradx = cv.convertScaleAbs(grad_x) grady = cv.convertScaleAbs(grad_y) cv.imshow("X_sch", gradx)#颜色变化在水平分层 cv.imshow("Y_sch", grady)#颜色变化在垂直分层 gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0) cv.imshow("xy_sch", gradxy) # lapalian 算子 def lapalian_image(image): ''' dst = cv.Laplacian(image, cv.CV_32F) lpls = cv.convertScaleAbs(dst) ''' kernel = np.array([[0,1,0],[1,-4,1],[0,1,0]]) #定义卷积和 可以尝试其他的 dst = cv.filter2D(image,cv.CV_32F,kernel=kernel) lpls = cv.convertScaleAbs(dst) #上述3行是自定义的 cv.imshow("lpls", lpls) #图像锐化 def custom_blur_demo(image): kernel = np.array(([0,-1,0],[-1,5,-1],[0,-1,0]),np.float32) dst = cv.filter2D(image,-1,kernel=kernel) cv.imshow('custom_blur_demo',dst) if __name__ == "__main__": filepath = "C:\\pictures\\0000.png" img = cv.imread(filepath) # blue green red # cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) cv.imshow("input image",img) custom_blur_demo(img) cv.waitKey(0) cv.destroyAllWindows()

Soble算子图 拉普拉斯算子: 图像锐化对比:

最新回复(0)