이미지에서 소벨 가장자리 감지를 수행해야하는 학교 지정을하고 있습니다. 우리는 sobel 코어와 convolution을 수행하고 각 픽셀에 대한 gradient magnitude를 계산해야합니다. 그런 다음 임계 값 방법에 따라 임계 값에 따라 픽셀에 255 (흰색) 또는 0 (검정) 값을 지정해야합니다. 가장자리 감지 의 출력 이미지는이되어야합니다. BufferedImage.TYPE_BYTE_BINARY이어야합니다. 나는 그레이 스케일 이미지를 입력으로 사용하지만 endresult는 매우 이상하게 보입니다. 확실히 가장자리를 감지하지 못합니다.출력으로 BufferedImage.TYPE_BYTE_BINARY를 사용한 소벨 가장자리 감지
Google 검색을 통해 작업 코드 (here, 표시된 정답을 참조)를 찾을 수 있지만 여기서 출력 이미지는 허용되지 않는 BufferedImage.TYPE_INT_RGB 유형입니다 ...이 질문에서 BufferedImage.TYPE.INT.RGB를 엣지 검출의 인풋으로서 사용한다.
이 문제를 해결하는 데 도움을 주셔서 감사합니다.
결과가 프로그램을 실행하면. 가장자리 감지 결과가 맨 오른쪽에 있습니다. 에지 검출 결과 이 어떻게 보일지
내 코드 :
/**
* turns an image to a grayscale version of the image
*/
public void alterImageGrayScale() throws IOException {
imageGrayScale = new BufferedImage(imageOriginal.getWidth(), imageOriginal.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
for(int i = 0; i < imageOriginal.getWidth(); i++) {
for(int j = 0; j < imageOriginal.getHeight(); j++) {
Color c = new Color(imageOriginal.getRGB(i, j));
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
int gray = (int) (0.2126*red + 0.7152*green + 0.0722*blue);
imageGrayScale.setRGB(i, j, new Color(gray, gray, gray).getRGB());
}
}
}
/**
* edge detection
* @throws IOException
*/
public void alterEdgeDetection() throws IOException {
imageBlackAndWhite = new BufferedImage(imageGrayScale.getWidth(), imageGrayScale.getHeight(), BufferedImage.TYPE_INT_RGB);
int x = imageGrayScale.getWidth();
int y = imageGrayScale.getHeight();
int threshold = 250;
for (int i = 1; i < x - 1; i++) {
for (int j = 1; j < y - 1; j++) {
int val00 = imageGrayScale.getRGB(i - 1, j - 1);
int val01 = imageGrayScale.getRGB(i - 1, j);
int val02 = imageGrayScale.getRGB(i - 1, j + 1);
int val10 = imageGrayScale.getRGB(i, j - 1);
int val11 = imageGrayScale.getRGB(i, j);
int val12 = imageGrayScale.getRGB(i, j + 1);
int val20 = imageGrayScale.getRGB(i + 1, j - 1);
int val21 = imageGrayScale.getRGB(i + 1, j);
int val22 = imageGrayScale.getRGB(i + 1, j + 1);
int gradientX = ((-1 * val00) + (0 * val01) + (1 * val02)) + ((-2 * val10) + (0 * val11) + (2 * val12))
+ ((-1 * val20) + (0 * val21) + (1 * val22));
int gradientY = ((-1 * val00) + (-2 * val01) + (-1 * val02)) + ((0 * val10) + (0 * val11) + (0 * val12))
+ ((1 * val20) + (2 * val21) + (1 * val22));
int gradientValue = (int) Math.sqrt(Math.pow(gradientX, 2) + Math.pow(gradientY, 2));
//???? feel like something should be done here, but dont know what
if(threshold > gradientValue) {
imageBlackAndWhite.setRGB(i, j, new Color(0, 0, 0).getRGB());
} else {
imageBlackAndWhite.setRGB(i, j, new Color(255, 255, 255).getRGB());
}
}
}
}
그레이 스케일 이미지를 'TYPE_BYTE_BINARY'로 변환하는 것이 좋다고 생각합니까? 그런 다음 기존의 에지 감지 코드를 사용하여 그레이 스케일 이미지를 생성하고 전용 방법의 마지막 단계로 "그레이 스케일 - 바이너리"변환 만 수행하면됩니다. – Marco13
나는 그것이 좋을 것이라고 생각한다. 내가 제공 한 다른 stackoverflow 질문에는 완벽하게 작동하는 코드가 있으며, 유일한 결과는 최종 결과가 'TYPE_INT_RGB'이미지입니다. 최종 결과가 TYPE_BYTE_BINARY가되도록 코드를 변경하는 방법을 모르겠다. 질문에 글을 쓰면서 회색 음영을 입력으로해야한다고 생각하지 않습니다. 문제가 발생하는 경우. 나는 그레이 스케일링이 에지 검출의 "외부"에서 일어난다 고 생각했고, 그것을 명시 적으로 @ Marco13을위한 코드로 작성해야만한다고 생각했습니다. – Isus