五、图像梯度计算

suaxi
2025-10-25 / 0 评论 / 8 阅读 / 正在检测是否收录...

1. Sobel算子

Sobel公式.png

共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 inline
img = cv2.imread('yuan.jpg', cv2.IMREAD_GRAYSCALE)

# cv2.imshow('img', img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
plt.imshow(img, cmap='gray')
plt.show()

1.1original.png

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()

1.2sobel_x.png

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()

1.3sobel_y.png

# 分别计算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()

1.4sobel_x+sobel_y.png

例:分别计算和整体计算的效果进行对比
ble = cv2.imread('ble.jpg', cv2.IMREAD_GRAYSCALE)

# cv2.imshow('ble', ble)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
plt.imshow(ble, cmap='gray')
plt.show()

1.5original.png

# 分别计算 (建议的操作方式)
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()

1.6sobel_x+sobel_y.png

# 整体计算
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()

1.7sobel_xy.png

2. Scharr算子

Scharr公式.png

共 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()

2.scharr_x+scharr_y.png

3. Laplacian算子

Laplacian公式.png

共 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()

3.laplacian.png

0

评论 (0)

取消