Sobel 연산자를 사용하여 가장자리 감지에 문제가 있습니다. 잘못된 가장자리가 너무 많아서 효과가 아래 그림에 표시됩니다. 3x3 sobel 연산자를 사용하고 있습니다. 첫 번째로 수직으로 추출한 다음 수평으로 출력하고, 최종 출력은 각 필터 출력의 크기입니다. 합성 이미지의 가장자리는 올바르게 추출되지만 자연 이미지는 흐림 또는 중간 값 필터를 적용하여 이미지를 사전 처리하더라도 너무 많은 잘못된 가장자리 또는 "노이즈"가 발생합니다. 이 문제의 원인은 무엇일까요? 구현 문제 (다음 : 왜 합성 이미지가 좋습니까?) 또는 좀 더 사전 처리해야합니까? 원래sobel 연산자 - false edges 자연스러운 이미지
:
출력 :
코드 :
이 때문에 어딘가에 코드에서 수학 오류로 나타납니다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