그래서 거래가 성사됩니다. 나는 (사용자에게) 컨볼 루션을 실행하는 방법을 단순화하려고했습니다. 이 소용돌이 필터를 실행하는 데 사용하고 이미지 아이콘을 통해 jfram 및 이미지 아이콘을 표시하려고 할 때 팝업, 그냥 큰 회색 사각형 팝업 않습니다.이미지 컨볼 루션 코드가 이미지를 제대로 표시하지 않습니까?
jframe/imageicon은이 필터 결과의 출력을 표시 할 때까지 완벽하게 작동했습니다.
float[][] sobel = { { -1, 0, 1},
{ -2, 0, 2},
{-1, 0, 1} };
someObject test = new someObject(filepath);
test.convolutionFilter(sobel);
public BufferedImage convolutionFilter(float[][] filter) {
int columns = filter.length;
int rows= filter[0].length;
float numTemp;
float[] filter1D = new float[columns*rows];
for (int j = 0; j<rows; j++) {
for (int i= 0; i< columns; i++) {
numTemp = filter[j][i];
System.out.print(numTemp + " ");
filter1D[j*columns + i] = numTemp;
}
}
Kernel kern = new Kernel(rows, columns, filter1D);
ConvolveOp op = new ConvolveOp(kern);
BufferedImage temp = new BufferedImage(processedImage.getWidth(), processedImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
op.filter(processedImage, temp);
processedImage = temp;
return processedImage;
}
코드는
내가 할 경우를 업데이트되었습니다없는 이미지와 비행기 회색 프레임을 표시합니다 내 GUI를 다음과 같습니다. 하나의 명령 만하고 다른 하나의 명령을 수행하지 않으면 이미지가 완벽하게 표시됩니다. BufferedImage testImage = ImageIO.read (filepath);
float[][] sobelFilter = { { -1, 0, 1},
{ -2, 0, 2},
{ -1, 0, 1} };
testImage = SimpleImage.toGrayscale(testImage);
testImage = SimpleImage.convolutionFilter(testImage, sobelFilter);
//use some swing functions to display image
그레이 스케일로 변환해야 올바른 결과를 얻을 수 있습니다. 필터를 적용하면 정확한 결과를 얻을 수 있습니다. 내가 이것을 완료하면 빈 화면이 나타납니다. 그들이 실행되는 순서를 바꾸면 (필터를 먼저 누른 다음 그레이 스케일로 변환) 결과가 나옵니다.
나는 그레이 스케일 변환 프로세스 뭔가가, 2 차원 이미지 필터를 취할 1D 배열로 풀다해야
toGrayscale이
있는 ConvolutionFilter를 그레이 스케일로 이미지를 변환해야합니다
회선을 속이고 생각하고 processedImage을 컨 볼브 그 결과를 돌려 준다.public class SimpleImage {
public static BufferedImage toGrayscale(BufferedImage processedImage) {
BufferedImage tempImage = new BufferedImage(processedImage.getWidth(), processedImage.getHeight(), processedImage.getType());
BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
tempImage = op.filter(processedImage, null);
return tempImage;
}
public static BufferedImage convolutionFilter(BufferedImage processedImage, float[][] filter2D) {
BufferedImage tempImage = new BufferedImage(processedImage.getWidth(), processedImage.getHeight(), processedImage.getType());
int columns = filter2D.length;
int rows= filter2D[0].length;
//Unrolls a 2D filter into a 1D filter
float[] filter1D = new float[columns*rows];
for (int j = 0; j<rows; j++) {
for (int i= 0; i< columns; i++) {
filter1D[j*columns + i] = filter2D[j][i];
}
}
//creates Kernal and convolution operator
Kernel kern = new Kernel(rows, columns, filter1D);
ConvolveOp op = new ConvolveOp(kern);
//apply filtering
tempImage = op.filter(processedImage, null);
return tempImage;
}
}
더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 질문 있니? (그리고 아니오, '?'를 제목에 추가해도 문제가되지 않습니다.) –
이것을 디버깅하려고했을 때 당신은 무엇을 발견 했습니까? –
@Adam 업데이트 된 코드가 정상적으로 작동했습니다. 내 대답 편집을 참조하십시오. – tenorsax