convertTo在opencv-python中使用

参考链接:https://cloud.tencent.com/developer/article/2042153

对一张输入图像完成Sobel滤波操作,C++实现的代码如下:

Mat image = imread("D:/images/dannis1.png", IMREAD_GRAYSCALE);
imshow("input", image);
Mat m1, m2;
image.convertTo(m1, CV_32F, 1.0 / 255.0);
Mat gradx;
Sobel(m1, gradx, -1, 1, 0);
gradx.convertTo(m2, CV_8U, 255);
imshow("sobel", m2);

Python对应的代码如下(错误处理):

import cv2 as cv
import numpy as np

image = cv.imread("D:/images/dannis1.png", cv.IMREAD_GRAYSCALE)
cv.imshow("input", image)
m1 = np.float32(image) / np.float(255)
gradx = cv.Sobel(m1, -1, 1, 0);
m2 = np.uint8(gradx * 255)
cv.imshow("sobel", m2)
cv.waitKey(0)
cv.destroyAllWindows()

以往的经验处理方式是先对gradx做归一化然后再显示

这个时候只需添加一行代码即可获得正确结果,把代码:

m2 = np.uint8(gradx * 255)

替换为:

cv.normalize(gradx, gradx, 0, 1.0, cv.NORM_MINMAX)m2 = np.uint8(gradx * 255)

然后再次运行,截图如下:

但是实际结果与C++并不一致,这个时候正确修改方式如下:

m2 = np.uint8(gradx * 255)

替换为:

m2 = np.uint8(np.clip(gradx * 255, 0, 255))

然后再次运行,截图如下:

 

 

posted @ 2025-05-05 14:13  kuaqi  阅读(31)  评论(0)    收藏  举报