我正在尝试使用自己的内核来模糊图像(出于教育目的)。但我的内核只是让我的整个图像变白。我的模糊内核是否正确?我相信我尝试应用的模糊滤镜的正确名称是标准化模糊。
void blur_img(const Mat& src, Mat& output) {
// src is a 1 channel CV_8UC1
float kdata[] = { 0.0625f, 0.125f, 0.0625f, 0.125f, 0.25f, 0.125f, 0.0625f, 0.125f, 0.0625f };
//float kdata[] = { -1,-1,-1, -1,8,-1, -1,-1,-1}; // outline filter works fine
Mat kernel(3, 3, CV_32F, kdata);
// results in output being a completely white image
filter2D(src, output, CV_32F, kernel);
}
答案 0 :(得分:0)
你的图像不是白色的,是浮动的。我相信你在以后的地方用imshow
显示图像,它看起来都是白色的。这在imshow
documentation中有解释。具体做法是:
如果图像是32位浮点,则像素值相乘 也就是说,值范围[0,1]被映射到[0,255]。
这意味着如果它是浮点数,则必须正确显示[0,1]值。
现在,我们知道是什么导致它,让我们看看如何解决它。我可以想到3种可能的方式:
1) normalize
图片为[0,1]
cv::Mat dst;
cv::normalize(outputFromBlur, dst, 0, 1, cv::NORM_MINMAX);
此函数将值标准化,因此它可能会移动颜色......这不是已知图像的最佳颜色,而是深度图或其他具有未知颜色值的矩阵。
2) covertTo
uchar:
cv::Mat dst;
outputFromBlur.convertTo(dst, CV_8U);
此函数执行saturate_cast,因此它可以处理可能的上溢/下溢。
3)将filter2D
与另一个输出深度一起使用:
cv::filter2D(src, output, -1, kernel);
使用-1时,欲望输出将与源的类型相同(我假设您的源是CV_8U)
如果不发表评论,我希望这会对你有所帮助。