文末有相关文档和视频链接,打字太慢,就只写关键部分,望理解。

正文

0.1 Premitt、Roberts算子

# Premitt算子
kx = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32)
ky = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]], dtype=np.float32)

# Roberts算子
kx = np.array([[-1, 0], [0, 1]], dtype=np.float32)
ky = np.array([[0, -1], [1, 0]], dtype=np.float32)

cv.filter2D(img, -1, kernel)

0.2 Sobel、Scharr算子

cv.Sobel(img, cv.CV_16S, 1, 0, ksize=3)
cv.Scharr(img, cv.CV_64F, 0, 1, ksize=3)

0.3 Laplacian、LoG算子

cv.Laplacian(img, cv.CV_16S)

0.4 Canny边缘检测

cv.Canny(img, 20, 200)

实例

以其中一个算子为例子。

Prewitt算子

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
        plt.imshow(img)
    plt.show()


img = cv.imread('pic/gift500x500.jpg', 0)

kx = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32)
ky = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]], dtype=np.float32)

imgX = cv.filter2D(img, cv.CV_64F, kx)
imgY = cv.filter2D(img, cv.CV_64F, ky)

imgXY = np.sqrt(imgX**2 + imgY**2)
imgXY2 = np.abs(imgX) + np.abs(imgY)

show(np.hstack([imgXY.clip(0,255), imgXY2.clip(0, 255)]))

效果


说明:

  1. 未经许可,谢绝转载。
  2. 本教程为《数字图像处理Python OpenCV实战》的配套代码相关内容。
    免费视频教程为0-6章(标题号≤6),可在此处点击观看。
    所有课件及源代码可在此处下载:
    链接:https://pan.baidu.com/s/198PySe_vebO3e06idHSQ6g
    提取码:11o4
    有问题可在QQ群(1079300899)指出,进群答案:数字图像处理。在本文评论指出可能导致回复很晚。