Olá pessoal do fórum, estou tentando e não estou conseguindo, talvez alguém possa me ajudar. Minha imagem está cheinha de ruídos de modo que não sá nem para entender. Transformo uma imagem em BufferedImage e depois numa matriz bidimensional (chamada de pixelatual[w][h]).
Utilizando essa matriz, aplico o filtro de Sobel (abaixo é o 3º) que me retorna um BufferedImage. O método de sobel chama o método que transforma a matriz[][] em BufferedImage (é o 4º). Quando exibo a img na tela (é o 1º), ela fica cheia de ruídos. Já olhei o código de pé à cabeça, mas não entendi onde está o problema. Segue abaixo os métodos (comentados) que utilizo. Alguém pode me ajudar por que esses ruídos aparecem?
1º)
//este método coloca a imagem no painel (ImagePanel)
public void porImagemNaTela(BufferedImage bufi) {
try {
AtualizarTela();//limpa o painel
Graphics g = bufi.getGraphics();
ImagePanel p = new ImagePanel();
p.setBufferedImage(bufi);
p.paintComponent(g);
PainelCentral.add(p, new BorderLayout().CENTER);
limiar_jSlider1.setVisible(true);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, " Houve exceção do tipo " + e.getMessage() + " no método porImagemNaTela.");
}
}
2º)
//aqui eu chamo o método que aplica o filtro de Sobel que retorna um BufferedImage e depois chamo o método que exibe na tela
private void ItemFiltroSobelActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
BufferedImage bufi = new pdi.Filtro.FiltroSobel().FiltroSobel(pixelAtual);
//após fazer a alteração, eu exibo na no JPanel
porImagemNaTela(bufi);//este método expliquei acima
setVisible(true);
}
3º)
// método que utilizo para aplicar o filtro de Sobel (recebe uma imagem bidimensional e retorna um BufferedImage) e chamar o método que transforma a matriz[][] em BufferedImage
public java.awt.image.BufferedImage FiltroSobel(int[][] pixelAtual){
pdi.Pixel p = new pdi.Pixel();
int Gx, Gy;
//pego o bufferedImage a fim de conseguir a largura a altura da imagem
//obtendo largura e altura da imagem
int w = pixelAtual.length, h = pixelAtual[0].length;
for(int j=0; j<h-1; j++){
for(int i=0; i<w-1;i++){
if(i!=0){
if(j!=0){
Gx = (((-1)*pixelAtual[i-1][j-1]+ (-2)*pixelAtual[i-1][j] + (-1)*pixelAtual[i-1][j+1])/4 -
(pixelAtual[i+1][j-1] + 2*pixelAtual[i +1][j] + 1*pixelAtual[i+1][j+1])/4)/2;
Gy = (((-1)*pixelAtual[i-1][j-1] + (-2)*pixelAtual[i][ j -1] + (-1)*pixelAtual[i+1][j-1])/4-
(pixelAtual[i-1][j+1] + 2*pixelAtual[i][ j+1 ] + pixelAtual[i+1][j+1])/4)/2;
pixelAtual[i][j] = pixelAtual[i][j] = (int) Math.sqrt(Gx*Gx + Gy*Gy);//Gx*Gx + Gy*Gy;
}
}
}
}
return p.setPixelEscalaDeCinza(pixelAtual);
}
4º)
// transforma matriz bidimensional em BufferesImage
public BufferedImage setPixelEscalaDeCinza(int[][] mtzImg) {
int largura = mtzImg.length;
int altura = mtzImg[0].length;
BufferedImage image = new BufferedImage(largura, altura, BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster = image.getRaster();
for (int h = 0; h < largura; h++) {
for (int w = 0; w < altura; w++) {
raster.setSample(h, w, 0, mtzImg[h][w]);
}
}
return image;
}
Aguardando resposta…