OpenCV提供了很多边缘检测滤波函数,包括Laplacian()、Sobel()以及Scharr()。这些滤波函数都会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和颜色。
例如:
import cv2
if __name__ == "__main__":
img = cv2.imread("lena.jpg")
cv2.Laplacian(img, cv2.CV_8U, img, ksize=5)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
但是这些函数都很容易将噪声错误地识别为边缘。缓解这个问题的方法是在找到边缘之前对图像进行模糊处理。OpenCV也提供了许多模糊滤波函数,包括blur()、medianBlur()以及GaussianBlur()。
def stroke_edges(src, dst, blur_ksize=7, edge_ksize=5):
if blur_ksize >= 3:
blurred_src = cv2.medianBlur(src, blur_ksize)
gray_src = cv2.cvtColor(blurred_src, cv2.COLOR_BGR2GRAY)
else:
gray_src = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
cv2.Laplacian(gray_src, cv2.CV_8U, gray_src, ksize=edge_ksize)
normalized_inverse_alpha = (1.0 / 255) * (255 - gray_src)
channels = cv2.split(src)
for channel in channels:
channel[:] = channel * normalized_inverse_alpha
cv2.merge(channels, dst)
想了解更多关于数字图像处理:数字图像处理专栏