重磅干货,第一时间送达
微信公众号:OpenCV学堂
函数说明
CV_8U 转换为CV_32F
alpha=1.0/255.0时表示从0~255切换到0~1之间
CV_32F 转换为CV_8U
alpha=255时表示从0~1切换到0~255之间
C++/Python对比
对一张输入图像完成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))
然后再次运行,截图如下:
下载1:OpenCV-Contrib扩展模块中文版教程
联系客服