使用C++实现OpenCV谐波均值滤波仅左半部分生效问题排查
谐波均值滤波实现问题
原始图像与处理后图像对比:左侧为原始图像,右侧为经谐波均值滤波处理后的图像(仅左半部分被处理)。
以下是我最初的实现代码:
Mat HarmonicBlur(Mat img, int size) { img += 1; Mat imgBlur; img.copyTo(imgBlur); int radius = size / 2; uchar* pointImg = img.data; uchar* pointImageBlur = imgBlur.data; size_t stepImg = img.step; size_t stepImgBlur = imgBlur.step; for (int i = radius; i < img.rows - radius; i++) { for (int j = radius; j < img.cols - radius; j++) { std::vector<double> neighbors; for (int k = -radius; k <= radius; k++) { for (int l = -radius; l <= radius; l++) { neighbors.push_back(double(pointImg[(i + k) * stepImg + j + l])); } } double sum = 0.0; for (int m = 0; m < neighbors.size(); m++) { sum += 1.0 / neighbors[m]; } uchar n = neighbors.size() / sum; pointImageBlur[i * stepImgBlur + j] = n; } } //normalize(imgBlur, imgBlur, 0, 255, 32); return imgBlur; }
我尝试过用.at遍历和指针遍历两种方式,结果完全一致。之后又修改代码,用imgBlur.create()创建图像,处理后的图像效果如下:
(注:原问题附带处理后图像,此处以文字说明替代)
对应的修改后代码:
Mat HarmonicBlur(Mat img, int size) { img += 1; Mat imgBlur; //img.copyTo(imgBlur); imgBlur.create(img.rows, img.cols, img.type()); int radius = size / 2; uchar* pointImg = img.data; uchar* pointImageBlur = imgBlur.data; size_t stepImg = img.step; size_t stepImgBlur = imgBlur.step; for (int i = radius; i < img.rows - radius; i++) { for (int j = radius; j < img.cols - radius; j++) { std::vector<double> neighbors; for (int k = -radius; k <= radius; k++) { for (int l = -radius; l <= radius; l++) { neighbors.push_back(double(pointImg[(i + k) * stepImg + j + l])); } } double sum = 0.0; for (int m = 0; m < neighbors.size(); m++) { sum += 1.0 / neighbors[m]; } uchar n = neighbors.size() / sum; pointImageBlur[i * stepImgBlur + j] = n; } } //normalize(imgBlur, imgBlur, 0, 255, 32); return imgBlur; }
内容的提问来源于stack exchange,提问作者tao
相关产品推荐
相关产品推荐

