Opencv 具有两个差分函数的平均图像

Opencv 具有两个差分函数的平均图像,opencv,image-processing,Opencv,Image Processing,我想处理图像,使每个像素值将其值和4邻居的平均值 创建了两个不同的函数: Mat meanImage(cv::Mat& inputImage) { Mat output; Mat kernel(3,3,CV_32F,0.0); kernel.at<float>(0,1) = 0.2; kernel.at<float>(1,0) = 0.2; kernel.at<float>(1,1) = 0.2; ker

我想处理图像,使每个像素值将其值和4邻居的平均值

创建了两个不同的函数:

Mat meanImage(cv::Mat& inputImage)
{
    Mat output;
    Mat kernel(3,3,CV_32F,0.0);
    kernel.at<float>(0,1) = 0.2;
    kernel.at<float>(1,0) = 0.2;
    kernel.at<float>(1,1) = 0.2;
    kernel.at<float>(1,2) = 0.2;
    kernel.at<float>(2,1) = 0.2;
    filter2D(inputImage,output,-1,kernel);
    return output;
}
从差异中得到很多好处这些功能之间有什么区别?

编辑: 从中拍摄的lena图像的差异


请注意,当您计算像素总和时,添加了
无符号字符
s,可能会溢出

通过将这些像素值强制转换为
int
来测试代码

outPtr[i] = ((int)tempPtr[i+rowLenTemp+a] + (int)tempPtr[i+a] + 
             (int)tempPtr[i+rowLenTemp+a+3] + (int)tempPtr[i+rowLenTemp+a-3] +   
             (int)tempPtr[i+twoRowLenTemp+a]) / 5;
编辑:我宁愿这样编码(假设图像类型为uchar,并且有3个通道)

for(int r=0;r
您的图像类型是什么?您的意思是CV_8UC3?是的,应该是CV_8UC3。感谢您的优化建议。它比我的实现速度快。我还将强制转换的建议应用于int,并查看溢出的可能性。有线的东西是,它没有什么区别,我已经测试了不同的图像。这个答案并没有回答我的问题。您的实现结果与我的实现结果相同,但与
cv::filter2D
meanImage
不同。它也应该是
currentRow[c-3]
currentRow[c+3]
我建议编辑。您能发布一个您观察到的差异的屏幕截图吗,这可能有助于我们解决您的问题。问题中添加了差异截图。
Mat diff;
compare(meanImg1,meanImg2,diff,CMP_NE);
printf("Difference: %d\n",countNonZero(diff));
imshow("diff",diff);
outPtr[i] = ((int)tempPtr[i+rowLenTemp+a] + (int)tempPtr[i+a] + 
             (int)tempPtr[i+rowLenTemp+a+3] + (int)tempPtr[i+rowLenTemp+a-3] +   
             (int)tempPtr[i+twoRowLenTemp+a]) / 5;
for (int r = 0; r < output.rows; r++)
{
  uchar* previousRow = temp.ptr<uchar>(r) + 3; 
  uchar* currentRow = temp.ptr<uchar>(r+1) + 3; 
  uchar* nextRow = temp.ptr<uchar>(r+2) + 3; 

  uchar* outRow = output.ptr<uchar>(r);

  for (int c = 0; c < 3*output.cols; c++)
  {
    int value =              (int)previousRow[c] +  
      (int)currentRow[c-3] + (int)currentRow [c] + (int)currentRow[c+3] + 
                             (int)nextRow    [c];

    outRow[c] = value / 5;
  }
}