我正在尝试通过指针执行平均平滑。
我的目标是按指针处理图像。
这就是我编码的内容。
代码:
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;
}
输入图片:
输出图片
问题:指针不能很好地处理我的图像。谁能纠正我在代码中的错误。谢谢
任何人都可以帮我纠正我的代码。谢谢 。
答案 0 :(得分:1)
首先,您必须检查您的代码。它似乎需要进行大修,例如:
无论如何,请看最后一行。你首先将saturate_cast除以9之前。先分开,然后再进行投射。
答案 1 :(得分:1)
尝试
Mat src = imread("best-testimg.jpg", IMREAD_GRAYSCALE);
似乎只处理了三分之一的图片,因为您没有考虑频道数。