【问题标题】:OpenCV Median Filter for double Matrix用于双矩阵的 OpenCV 中值滤波器
【发布时间】:2014-10-07 12:56:43
【问题描述】:
【问题讨论】:
标签:
c++
opencv
filter
median
【解决方案1】:
你可以这样做:
cv::Mat_<double> input;
cv::Mat_<double> output; // or cv::Mat output;
cv::medianBlur(input, output, 3);
PS:您必须确保 int ksize 只能是 3 或 5 用于您的输入(双垫)。如documentation中所说:
参数:
src——输入1、3、4通道图像; ksize为3或5时,图像深度应为CV_8U, CV_16U或CV_32F,对于更大的光圈尺寸,只能为CV_8U。
...
ksize – 光圈线性大小; 必须是奇数且大于 1,例如:3、5、7 ...
【解决方案2】:
可以使用 cv::UMat 来操作 OpenCL/CUDA
cv::UMat input;
cv::UMat output;
对于 ksize >5
cv::UMat tmp;
if (ksize>5){
switch (input.type()) {
case CV_16UC1:
case CV_16UC3:
case CV_16UC4:
input.convertTo(tmp,CV_8U,1./255.);
break;
case CV_32FC1:
case CV_32FC3:
case CV_32FC4:
input.convertTo(tmp,CV_8U,255.);
break;
default:
input.assignTo(tmp);
break;
}
}else{
input.assignTo(tmp);
}
try{
cv::medianBlur(tmp, output, ksize);
}
catch (cv::Exception& ex) {
qWarning()<<"medianBlurImage error"<<ex.what();
}