我遇到了使用Sobel算子的邊緣檢測問題:它產生太多假邊緣,效果顯示在下面的圖片上。 我正在使用3x3 sobel算子 - 首先提取垂直和水平,最終輸出是每個濾波器輸出的幅度。 合成圖像上的邊緣被正確提取,但即使通過應用模糊或中值濾波器預處理圖像,自然圖像也會產生太多假邊緣或「噪點」。 這可能是什麼原因造成的?它是實現問題(那麼:爲什麼合成圖像很好?)或者我需要做更多的預處理?sobel算子 - 假邊緣自然圖像
原文:
輸出:
代碼:
void imageOp::filter(image8* image, int maskSize, int16_t *mask)
{
if((image == NULL) || (maskSize/2 == 0) || maskSize < 1)
{
if(image == NULL)
{
printf("filter: image pointer == NULL \n");
}
else if(maskSize < 1)
{
printf("filter: maskSize must be greater than 1\n");
}
else
{
printf("filter: maskSize must be odd number\n");
}
return;
}
image8* fImage = new image8(image->getHeight(), image->getWidth());
uint16_t sum = 0;
int d = maskSize/2;
int ty, tx;
for(int x = 0; x < image->getHeight(); x++) //
{ // loop over image
for(int y = 0; y < image->getWidth(); y++) //
{
for(int xm = -d; xm <= d; xm++)
{
for(int ym = -d; ym <= d; ym++)
{
ty = y + ym;
if(ty < 0) // edge conditions
{
ty = (-1)*ym - 1;
}
else if(ty >= image->getWidth())
{
ty = image->getWidth() - ym;
}
tx = x + xm;
if(tx < 0) // edge conditions
{
tx = (-1)*xm - 1;
}
else if(tx >= image->getHeight())
{
tx = image->getHeight() - xm;
}
sum += image->img[tx][ty] * mask[((xm+d)*maskSize) + ym + d];
}
}
if(sum > 255)
{
fImage->img[x][y] = 255;
}
else if(sum < 0)
{
fImage->img[x][y] = 0;
}
else
{
fImage->img[x][y] = (uint8_t)sum;
}
sum = 0;
}
}
for(int x = 0; x < image->getHeight(); x++)
{
for(int y = 0; y < image->getWidth(); y++)
{
image->img[x][y] = fImage->img[x][y];
}
}
delete fImage;
}
究竟是什麼問題? – Junuxx
您使用的是標準的3x3 sobel操作符,據推測? – Rook
這可能是什麼原因?它是實現問題(那麼:爲什麼合成圖像很好?)或者我需要做更多的預處理? – user1821186