1、Sobel算子和Scharr
dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
前四个是必须的参数:
- 第一个参数是需要处理的图像;
- 第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
- dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。
其后是可选的参数:
- dst不用解释了;
- ksize是Sobel算子的大小,必须为1、3、5、7。
- scale是缩放导数的比例常数,默认情况下没有伸缩系数;
- delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
- borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。
#引入opencv模块 import cv2 as cv #引入numpy模块 import numpy as np #引入sys模块 import sys #soble def sobel_test(img): grad_x = cv.Sobel(img,cv.CV_32F,1,0) grad_y = cv.Sobel(img,cv.CV_32F,0,1) gradx = cv.convertScaleAbs(grad_x) grady = cv.convertScaleAbs(grad_y) cv.imshow("gradient-x",gradx) cv.imshow("gradient-y",grady) #grad_xy = cv.Sobel(img,cv.CV_32F,2,1) #gradxy = cv.convertScaleAbs(grad_xy) #cv.imshow("gradient-xy",gradxy) gradxyadd = cv.addWeighted(gradx,0.5,grady,0.5,0) cv.imshow("gradient-xyadd",gradxyadd) def scharr_test(img): grad_x = cv.Scharr(img,cv.CV_32F,1,0) grad_y = cv.Scharr(img,cv.CV_32F,0,1) gradx = cv.convertScaleAbs(grad_x) grady = cv.convertScaleAbs(grad_y) cv.imshow("scharrgradient-x",gradx) cv.imshow("scharrgradient-y",grady) #grad_xy = cv.Sobel(img,cv.CV_32F,2,1) #gradxy = cv.convertScaleAbs(grad_xy) #cv.imshow("scharrgradient-xy",gradxy) gradxyadd = cv.addWeighted(gradx,0.5,grady,0.5,0) cv.imshow("scharrgradient-xyadd",gradxyadd) def img_test(): img = cv.imread('E:/chenopencvblogimg/lena22.jpg') #判断是否读取成功 if img is None: print("Could not read the image,may be path error") return cv.namedWindow("origin Pic",cv.WINDOW_NORMAL) cv.imshow("origin Pic",img) sobel_test(img) scharr_test(img) #让显示等待键盘输入维持在那里,否则程序跑完就闪退啦! cv.waitKey(0) #销毁窗口 cv.destroyAllWindows() if __name__ == '__main__': sys.exit(img_test() or 0)
-
-
-
2、Laplacian算子
-
#引入opencv模块 import cv2 as cv #引入numpy模块 import numpy as np #引入sys模块 import sys #soble def sobel_test(img): grad_x = cv.Sobel(img,cv.CV_32F,1,0) grad_y = cv.Sobel(img,cv.CV_32F,0,1) gradx = cv.convertScaleAbs(grad_x) grady = cv.convertScaleAbs(grad_y) cv.imshow("gradient-x",gradx) cv.imshow("gradient-y",grady) #grad_xy = cv.Sobel(img,cv.CV_32F,2,1) #gradxy = cv.convertScaleAbs(grad_xy) #cv.imshow("gradient-xy",gradxy) gradxyadd = cv.addWeighted(gradx,0.5,grady,0.5,0) cv.imshow("gradient-xyadd",gradxyadd) def scharr_test(img): grad_x = cv.Scharr(img,cv.CV_32F,1,0) grad_y = cv.Scharr(img,cv.CV_32F,0,1) gradx = cv.convertScaleAbs(grad_x) grady = cv.convertScaleAbs(grad_y) cv.imshow("scharrgradient-x",gradx) cv.imshow("scharrgradient-y",grady) #grad_xy = cv.Sobel(img,cv.CV_32F,2,1) #gradxy = cv.convertScaleAbs(grad_xy) #cv.imshow("scharrgradient-xy",gradxy) gradxyadd = cv.addWeighted(gradx,0.5,grady,0.5,0) cv.imshow("scharrgradient-xyadd",gradxyadd) def laplacian_test(img): dst = cv.Laplacian(img,cv.CV_32F) lpls = cv.convertScaleAbs(dst) cv.imshow("laplacian_test",lpls) #四领域laplacian核定义实现 def laplacian_kernel_4(img): kernel = np.array([[0,1,0],[1,-4,1],[0,1,0]]) dst = cv.filter2D(img,cv.CV_32F,kernel=kernel) lpls = cv.convertScaleAbs(dst) cv.imshow("laplacian_kernel_4",lpls) #八领域laplacian核定义实现 def laplacian_kernel_8(img): kernel = np.array([[1,1,1],[1,-8,1],[1,1,1]]) dst = cv.filter2D(img,cv.CV_32F,kernel=kernel) lpls = cv.convertScaleAbs(dst) cv.imshow("laplacian_kernel_8",lpls) def img_test(): img = cv.imread('E:/chenopencvblogimg/lena22.jpg') #判断是否读取成功 if img is None: print("Could not read the image,may be path error") return cv.namedWindow("origin Pic",cv.WINDOW_NORMAL) cv.imshow("origin Pic",img) #sobel_test(img) #scharr_test(img) laplacian_test(img) laplacian_kernel_4(img) laplacian_kernel_8(img) #让显示等待键盘输入维持在那里,否则程序跑完就闪退啦! cv.waitKey(0) #销毁窗口 cv.destroyAllWindows() if __name__ == '__main__': sys.exit(img_test() or 0)