1

그래서 거래가 성사됩니다. 나는 (사용자에게) 컨볼 루션을 실행하는 방법을 단순화하려고했습니다. 이 소용돌이 필터를 실행하는 데 사용하고 이미지 아이콘을 통해 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; 

    } 
} 
+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 질문 있니? (그리고 아니오, '?'를 제목에 추가해도 문제가되지 않습니다.) –

+0

이것을 디버깅하려고했을 때 당신은 무엇을 발견 했습니까? –

+0

@Adam 업데이트 된 코드가 정상적으로 작동했습니다. 내 대답 편집을 참조하십시오. – tenorsax

답변

3

는 확실하지 무엇을 당신의 입력 이미지입니다, 그래서 당신은 당신을 위해 temp 이미지 생성자를 지정 imageType (BufferedImage.TYPE_INT_ARGB) 인수에 차이가있을 수 있습니다. 그런 다음 결과 이미지가 소스로 만든 것입니다

public BufferedImage convolutionFilter(float[][] filter, BufferedImage processedImage) { 
... 
Kernel kern = new Kernel(rows, columns, filter1D); 
ConvolveOp op = new ConvolveOp(kern); 
BufferedImage temp = op.filter(processedImage, null); 
return temp; 
} 

:

op.filter(processedImage, temp);

당신은 ConvolveOp.filter()에 의해 반환 된 이미지를 사용, 다음을 시도 할 수 있습니다 : 당신의 목적지의 이미지를 제공 할 필요가 없습니다 ColorModel. 난 당신이 toGrayScale /있는 ConvolutionFilter 조합으로 발생하는 문제를 재현 할 수 toGrayscale() 도입

편집 할 수 있습니다. 업데이트 된 방법을 모두 사용하여 정확한 결과를 얻고 있습니다. 사용중인 이미지를 공유 할 수있는 기회가 있습니까?

편집 :

이 코드는 언급 이미지를 작동합니다

또한
public static void main(String args[]) { 
    try { 
     BufferedImage image = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png")); 
     image = SimpleImage.toGrayscale(image); 
     image = SimpleImage.convolutionFilter(image, sobel); 
     JOptionPane.showMessageDialog(null, "", "", JOptionPane.INFORMATION_MESSAGE, new ImageIcon(image)); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e.getMessage(), "Failure", JOptionPane.ERROR_MESSAGE); 
     e.printStackTrace(); 
    } 
    } 

이 언급 이미지의 유형 TYPE_3BYTE_BGR입니다 있습니다. 이는 ConvolveOp의 올바른 작동을 방해 할 수 있습니다. 다음은 bug입니다. Java 7에서만 수정 된 것처럼 보입니다.

또한 구현시 tempImage의 초기 할당이 toGrayscale()convolutionFilter()은 중복되는 점에 유의하십시오.

+0

위키 피 디아 페이지에서 얻은 표준 이미지 Lenna.png로 시도했습니다. http://en.wikipedia.org/wiki/Lenna (바로이) – Adam

+0

@Adam, 어떤 결과가 나오는지보십시오 마지막 편집의 코드로 – tenorsax

+0

wiki 페이지에있는 Lenna 이미지. http://upload.wikimedia.org/wikipedia/ko/thumb/2/24/Lenna.png/220px-Lenna.png 감사합니다. – Adam

관련 문제