使用图像处理图像平滑指针 - 需要帮助来纠正我的代码

时间:2016-07-18 06:20:41

标签: c++ opencv

我正在尝试通过指针执行平均平滑。

我的目标是按指针处理图像。

这就是我编码的内容。

代码:

int main() {

    Mat img = imread("best-testimg.jpg");

    Mat src = img.clone();

    int const templeteWindowSize = 3;

    int tr = templeteWindowSize >> 1; //templateRegion

    int bb = tr;                 //backgroundBorder

    //create large size image for bounding box;
    Mat im;
    copyMakeBorder(src, im, bb, bb, bb, bb, cv::BORDER_DEFAULT); //left= right= bottom= top = border = bb

    //=========================================================

    Mat dest = Mat::zeros(src.size(), src.type());

    int T = templeteWindowSize * templeteWindowSize;

    int count = T - 1;

    //step of template to image
    const int cstep = im.step - templeteWindowSize;

    for (int j = 0; j < src.rows; j++) {

        //src ptr
        uchar* d = dest.ptr(j);

        for (int i = 0; i < src.cols; i++) {

            uchar* tprt = im.data + im.step*(tr + j) + (tr + i); //pointer of image data amd step at 3x3 

            double tweight = 0.0;
            for (int n = templeteWindowSize; n--;)
            {
                for (int m = templeteWindowSize; m--;)
                {
                    tweight += *tprt++;
                }
                tprt += cstep;
            }
            tweight /= 9;
            *(d++) = (saturate_cast<uchar>(tweight) );
        }//i

    }//j    
    imshow("dest", dest);
    waitKey(0);
    return 0;
}

输入图片:

enter image description here

输出图片

enter image description here

问题:指针不能很好地处理我的图像。谁能纠正我在代码中的错误。谢谢

任何人都可以帮我纠正我的代码。谢谢 。

2 个答案:

答案 0 :(得分:1)

首先,您必须检查您的代码。它似乎需要进行大修,例如:

  • 为什么是intern_count
  • 为什么dest不包含相同的tr步骤来避免de border

无论如何,请看最后一行。你首先将saturate_cast除以9之前。先分开,然后再进行投射。

答案 1 :(得分:1)

尝试

Mat src = imread("best-testimg.jpg", IMREAD_GRAYSCALE);

似乎只处理了三分之一的图片,因为您没有考虑频道数。