如何找到4邻居拉普拉斯算子的卷积;这个节目有错吗

How to find convolving for the 4 neighbour laplacian;is any mistake in this programe?

本文关键字:卷积 节目 何找 邻居 普拉斯      更新时间:2023-10-16

我正在尝试为图像卷积实现4邻居拉普拉斯算子:我正处于这场运动的基本阶段,并试图建立我对如何处理图像。我的问题很基本,但我很困惑。

4邻居拉普拉斯算子:

0-1 0-1 4-10-1 0有人能发现错误吗?因为当我运行这个问题时,它什么都不做,而且在最后一个

给我下面这样的值。并且图像保持不变。

(507503)[r=55|g=55|b=55]

(507504)[r=59|g=59|b=59]

(507505)[r=4e|g=4e|b=4e]

(507506)[r=45|g=45|b=45]

(507507)[r=4|g=4|b=4]

(507508)[r=0|g=0|b=0]

(507509)[r=0|g=0|b=0]

(507510)[r=0|g=0|b=0]

(507511)[r=0|g=0|b=0]

(508,0)[r=0|g=0|b=0]

(508,1)[r=0|g=0|b=0]

(508,2)[r=0|g=0|b=0]

(508,3)[r=0|g=0|b=0]

(508,4)[r=0|g=0|b=0]

void MyFrame::OnTestingImage(wxCommandEvent & event)
{
printf("Testing...");
free(loadedImage);
loadedImage = new   wxImage(bitmap.ConvertToImage());
float kernel[3][3]= {{0, -1, 0},{-1,4, -1},{0, -1, 0}};
int r,g,b;
float intensity;
float sum = 0;
for( int i=0;i<imgWidth;i++)
for(int j=0;j<imgWidth;j++){
for(int r = -1;r<2;r++)
for(int t = -1;t<2;t++)
{
if(r+i<0 || r+i>imgWidth || j+t < 0||j+t>imgHeight )
intensity = 0;
else
intensity = loadedImage->(GetRed(i + kernel[r][t], j + kernel[r][t]));
sum += intensity *((float)kernel[r][t]);
}
sum = (int)intensity;
r = g = b = sum;
printf("(%d,%d) [r = %x  | g = %x | b = %x] n",i,j,r,g,b);
loadedImage->SetRGB(i,j,r,g,b);
}
printf(" Finished Testing.n");
Refresh();
}

我认为应该是

intensity = loadedImage->(GetRed(i + r, j + t));

如果我正确理解您的代码,那么您正在更新从中读取的相同图像loadedImage。因此,坐标i/j处的和将包含未处理的i+1/ji/j+1的值,但包含更新的i-1/ji/j-1的值。这是正确的吗?卷积不是这样工作的:总和中的所有像素都应该是原始值。实现这一点的最简单方法是将结果写入单独的图像。

附加:@lennon310是对的,当然,它应该是loadedImage->(GetRed(i + r, j + t));

如果单独处理边界元素,它会更快,因为可以避免if语句。只需从1迭代到size-1,然后为零边界元素。

您没有访问正确的元素。而不是intensity = loadedImage->(GetRed(i + kernel[r][t], j + kernel[r][t]));

写入intensity = loadedImage->(GetRed(i + r, j + t));

由于您只访问五个元素,因此可以完全避免内部for循环,只需编写

sum = 0
sum += loadedImage->(GetRed(i + 1, j + 1));
sum += loadedImage->(GetRed(i + 1, j - 1));
sum += loadedImage->(GetRed(i - 1, j + 1));
sum += loadedImage->(GetRed(i - 1, j - 1));
sum += 4 * loadedImage->(GetRed(i, j));`