1. Sobel算子

共p1,p2,p3,p4,p5,p6,p7,p8,p9 九个像素值
Gx = p3 - p1 + 2 x p6 - 2 x p4 + p9 - p7
Gy = p9 + 2 x p8 + p7 - p3 - 2 x p2 - p1
import cv2 # OpenCV 读取的格式是 BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inlineimg = cv2.imread('yuan.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.imshow('img', img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
plt.imshow(img, cmap='gray')
plt.show()
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
- src:源图像
- ddepth:图像的深度
- dx:水平方向
- dy:垂直方向
- ksize:Sobel算子的大小
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
# cv2.imshow('sobel_x', sobel_x)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
# 白 --> 黑 是正数,黑 --> 白 是负数,负数会被截断为0,需要进行绝对值转换
sobel_abs_x = cv2.convertScaleAbs(sobel_x)
plt.imshow(sobel_abs_x, cmap='gray')
plt.show()
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
# cv2.imshow('sobel_y', sobel_y)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
# 白 --> 黑 是正数,黑 --> 白 是负数,负数会被截断为0,需要进行绝对值转换
sobel_abs_y = cv2.convertScaleAbs(sobel_y)
plt.imshow(sobel_abs_y, cmap='gray')
plt.show()
# 分别计算x和y,再求和
sobel_x_y = cv2.addWeighted(sobel_display_x, 0.5, sobel_display_y, 0.5, 0)
plt.imshow(sobel_x_y, cmap='gray')
plt.show()
例:分别计算和整体计算的效果进行对比
ble = cv2.imread('ble.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.imshow('ble', ble)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
plt.imshow(ble, cmap='gray')
plt.show()
# 分别计算 (建议的操作方式)
ble_sobel_x = cv2.Sobel(ble, cv2.CV_64F, 1, 0, ksize=3)
ble_sobel_y = cv2.Sobel(ble, cv2.CV_64F, 0, 1, ksize=3)
ble_sobel_abs_x = cv2.convertScaleAbs(ble_sobel_x)
ble_sobel_abs_y = cv2.convertScaleAbs(ble_sobel_y)
ble_sobel_x_y = cv2.addWeighted(ble_sobel_abs_x, 0.5, ble_sobel_abs_y, 0.5, 0)
plt.imshow(ble_sobel_x_y, cmap='gray')
plt.show()
# 整体计算
ble_sobel_xy = cv2.Sobel(ble, cv2.CV_64F, 1, 1, ksize=3)
ble_sobel_abs_xy = cv2.convertScaleAbs(ble_sobel_xy)
plt.imshow(ble_sobel_abs_xy, cmap='gray')
plt.show()
2. Scharr算子

共 p1,p2,p3,p4,p5,p6,p7,p8,p9 九个像素值
Gx = 3 x p3 - 3 x p1 + 10 x p6 - 10 x p4 + 3 x p9 - 3 x p7
Gy = -3 x p1 - 10 x p2 - 3 x p3 - 3 x p7 - 10 x p8 - 3 x p9
ble_scharr_x = cv2.Scharr(ble, cv2.CV_64F, 1, 0)
ble_scharr_y = cv2.Scharr(ble, cv2.CV_64F, 0, 1)
ble_scharr_abs_x = cv2.convertScaleAbs(ble_scharr_x)
ble_scharr_abs_y = cv2.convertScaleAbs(ble_scharr_y)
ble_scharr_x_y = cv2.addWeighted(ble_scharr_abs_x, 0.5, ble_scharr_abs_y, 0.5, 0)
plt.imshow(ble_scharr_x_y, cmap='gray')
plt.show()
3. Laplacian算子

共 p1,p2,p3,p4,p5,p6,p7,p8,p9 九个像素值
G = p2 + p6 - 4 x p5 + p3 + p8
ble_laplacian = cv2.Laplacian(ble, cv2.CV_64F)
ble_laplacian_abs = cv2.convertScaleAbs(ble_laplacian)
plt.imshow(ble_laplacian_abs, cmap='gray')
plt.show()
评论 (0)