正确用于模糊过滤器的内核
Correct kernel for blur filter
我试图使用自己的内核模糊图像(出于教育目的(。但是我的内核只是使我的整个图像变白。我的模糊内核正确吗?我相信我要应用的模糊过滤器的专有名称是一个归一化的模糊。
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);
}
您的图像不是白色,是浮动的。我确定您是否正在以后的位置显示imshow
的图像,并且看起来全是白色的。这在imshow
文档中进行了解释。具体:
如果图像为32位浮点,则像素值乘以 到255。也就是说,值[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);
此函数确实会饱和,因此它可能处理可能的溢出/下流。
3(使用另一个输出深度的filter2D
:
cv::filter2D(src, output, -1, kernel);
带有-1的欲望输出将为相同类型的源(我认为您的源是CV_8U(
我希望这对您有帮助,如果不发表评论。
相关文章:
- 带过滤器的现代迭代c++集合
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- CUDA内核和数学函数的显式命名空间
- 码头化的C++应用程序是否向后兼容早期的内核版本
- C++内核出现Jupyter笔记本错误
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 如何将字符串添加到布谷鸟过滤器?
- 内存围栏是否涉及内核
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- OpenCL 内核参数中的字符***?
- 具有可分离内核的 2D 模糊卷积
- 如何在Windows内核中获取文件大小
- 库达如何将字符**从内核复制到主机
- 在事件过滤器之前发出对象的事件
- OpenCL 是否支持向量作为内核参数?
- C++对开销较少的容器使用多个过滤器
- pthread_spinlock是否会导致从用户空间切换到内核空间
- 如何在内核中添加包含库的路径?
- 正确用于模糊过滤器的内核
- 二项式模糊图像过滤器将内核应用于图像