Last active
March 18, 2017 00:38
-
-
Save codepainkiller/e45d9ad273a32ba23e71e1241f438e30 to your computer and use it in GitHub Desktop.
Extract image pattern
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.*; | |
import java.awt.event.*; | |
import java.awt.image.*; | |
import java.io.*; | |
import javax.imageio.*; | |
import javax.swing.*; | |
/** | |
* | |
* @author Martin Cruz | |
*/ | |
public class Imagen extends Component | |
{ | |
BufferedImage img; | |
double [][] matrizImg; //matrizImg de la imagen en escala de grises | |
double [][] matrizImg_R; //matrizImg de la imagen en R | |
double [][] matrizImg_G; //matriz de la imagen en G | |
double [][] matrizImg_B; //matriz de la imagen en B | |
int columnas; //numero de columnas | |
int filas; //numero de filas | |
public Imagen(String nombreImagen) | |
{ | |
try | |
{ | |
img = ImageIO.read(new File(nombreImagen)); | |
convertirImagenAMatriz(); | |
} | |
catch (IOException e) {} | |
} | |
public Imagen(double [][]matriz) | |
{ | |
convertirMatrizAImagen(matriz); | |
} | |
public int[][] getPattern() { | |
int TILES_WIDTH = 30; | |
int TILES_HEIGHT = 60; | |
int UMBRAL_GRIS = 50; // 0 - 255 | |
int UMBRAL_PORCENTAJE_PIXELS = 30; // 0% - 100% | |
int sizeTileFila = this.filas / TILES_HEIGHT; | |
int sizeTileCol = this.columnas / TILES_WIDTH; | |
int pixelPerTile = sizeTileFila * sizeTileCol; | |
int countTileFilas = this.filas / sizeTileFila; | |
int countTileCols = this.columnas / sizeTileCol; | |
int blackPixels[][] = new int[countTileFilas][countTileCols]; | |
int pattern[][] = new int[countTileFilas][countTileCols]; | |
for (int i = 0; i < filas; i++) { | |
for (int j = 0; j < columnas; j++) { | |
double pixel = matrizImg[i][j]; | |
if (pixel <= UMBRAL_GRIS) { | |
int posFila = (int) Math.floor(i / sizeTileFila); | |
int posCol = (int) Math.floor(j / sizeTileCol); | |
blackPixels[posFila][posCol]++; | |
} | |
} | |
} | |
// Estableciendo zonas pintadas mediante porcentajes | |
for (int i = 0; i < countTileFilas; i++) { | |
for (int j = 0; j < countTileCols; j++) { | |
int porcentaje = (blackPixels[i][j] * 100) / pixelPerTile; | |
if (porcentaje > UMBRAL_PORCENTAJE_PIXELS) { | |
pattern[i][j] = 1; | |
} else { | |
pattern[i][j] = 0; | |
} | |
} | |
} | |
// Mostrando patron de la imagen | |
System.out.println("Mostrando matriz de cantidad de pixeles"); | |
for (int i = 0; i < countTileFilas; i++) { | |
for (int j = 0; j < countTileCols; j++) { | |
System.out.print(pattern[i][j] + "\t"); | |
} | |
System.out.println(""); | |
} | |
return pattern; | |
} | |
public void convertirImagenAMatriz() | |
{ | |
filas = img.getHeight(); | |
columnas = img.getWidth(); | |
matrizImg = new double [filas][columnas]; | |
matrizImg_R = new double [filas][columnas]; | |
matrizImg_G = new double [filas][columnas]; | |
matrizImg_B = new double [filas][columnas]; | |
double r; | |
double g; | |
double b; | |
WritableRaster raster=img.getRaster();//leer cabecera | |
int numBandas=raster.getNumBands(); //numero de canales | |
for (int i=0;i<filas;i++) | |
{ | |
for(int j=0;j<columnas;j++) | |
{ | |
if (numBandas==3) | |
{ r=raster.getSampleDouble(j,i,0); | |
g=raster.getSampleDouble(j,i,1); | |
b=raster.getSampleDouble(j,i,2); | |
matrizImg[i][j]=(r+g+b)/3; | |
matrizImg_R[i][j]=r; | |
matrizImg_G[i][j]=g; | |
matrizImg_B[i][j]=b; | |
} | |
if (numBandas==1) | |
{ matrizImg[i][j]=raster.getSampleDouble(j,i,0); | |
matrizImg_R[i][j]=255; | |
matrizImg_G[i][j]=255; | |
matrizImg_B[i][j]=255; | |
} | |
} | |
} | |
} | |
public void convertirMatrizAImagen(double [][] matriz) | |
{ | |
int alto = matriz.length; | |
int ancho = matriz[0].length; | |
img = new BufferedImage(ancho,alto,BufferedImage.TYPE_BYTE_GRAY); | |
WritableRaster wr = img.getRaster(); | |
for (int i=0;i<alto;i++) | |
{ | |
for(int j=0;j<ancho;j++) | |
{ | |
wr.setSample(j,i,0,matriz[i][j]); | |
} | |
} | |
img.setData(wr); | |
} | |
public void convertirMatrizAImagenRGB(double [][]matriz_R, double [][]matriz_G, double [][]matriz_B) { | |
BufferedImage imgn = new BufferedImage(matriz_R[0].length,matriz_R.length,BufferedImage.TYPE_INT_RGB); | |
WritableRaster wr = imgn.getRaster(); | |
for (int i=0;i<matriz_R.length;i++) | |
{ for(int j=0;j<matriz_R[0].length;j++) | |
{ | |
wr.setSample(j,i,0,matriz_R[i][j]); | |
wr.setSample(j,i,1,matriz_G[i][j]); | |
wr.setSample(j,i,2,matriz_B[i][j]); | |
} | |
} | |
img.setData(wr); | |
} | |
public void guardarImagen(double [][]matriz, String path) | |
{ | |
BufferedImage img = new BufferedImage(matriz[0].length,matriz.length,BufferedImage.TYPE_BYTE_GRAY);//crear cabecera | |
WritableRaster wr = img.getRaster(); | |
for (int i=0;i<matriz.length;i++) | |
{ for(int j=0;j<matriz[0].length;j++) | |
{ | |
wr.setSample(j,i,0,matriz[i][j]); | |
} | |
} | |
img.setData(wr); | |
try | |
{ | |
ImageIO.write(img, "JPG", new File(path+".jpg")); | |
} | |
catch(IOException e){} | |
} | |
public void guardarImagen(double [][]matriz_R, double [][]matriz_G, double [][]matriz_B,String path) | |
{ | |
BufferedImage imgn = new BufferedImage(matriz_R[0].length,matriz_R.length,BufferedImage.TYPE_INT_RGB); | |
WritableRaster wr = imgn.getRaster(); | |
for (int i=0;i<matriz_R.length;i++) | |
{ for(int j=0;j<matriz_R[0].length;j++) | |
{ | |
wr.setSample(j,i,0,matriz_R[i][j]); | |
wr.setSample(j,i,1,matriz_G[i][j]); | |
wr.setSample(j,i,2,matriz_B[i][j]); | |
} | |
} | |
img.setData(wr); | |
try | |
{ | |
ImageIO.write(img, "JPG", new File(path+".jpg")); | |
} | |
catch(IOException e){} | |
} | |
@Override | |
public void paint(Graphics g) { | |
int x=0; | |
int y=800; //valor estandar de y | |
int p=0; | |
int q=0; | |
x = img.getWidth(null) * y/img.getHeight(null); | |
y = img.getHeight(null) * y/img.getHeight(null); | |
//g.drawImage(img, 100, 100, null); | |
g.drawImage(img, 0, 0, x, y, 0, 0, img.getWidth(null), img.getHeight(null), null); | |
//Graphics2D g2 = (Graphics2D) g; | |
} | |
@Override | |
public Dimension getPreferredSize() | |
{ | |
int x=0; | |
int y=800; | |
if (img == null) | |
{ | |
return new Dimension(100,100); | |
} | |
else | |
{ | |
x = img.getWidth(null) * y/img.getHeight(null); | |
y = img.getHeight(null) * y/img.getHeight(null); | |
return new Dimension(x, y); | |
} | |
} | |
/*Coloca una imagen en una ventana*/ | |
public static void ventana(double matriz[][],String nombre) | |
{ | |
Imagen imagen=new Imagen(matriz); | |
try | |
{ | |
JFrame f = new JFrame(nombre); | |
f.addWindowListener(new WindowAdapter() | |
{ | |
@Override | |
public void windowClosing(WindowEvent e) | |
{} | |
} | |
); | |
f.add(imagen); | |
f.pack(); | |
f.setVisible(true); | |
f.repaint(); | |
} | |
catch (Exception e) | |
{ | |
} | |
} | |
public static void ventana(Imagen img,String nombre) | |
{ | |
//Imagen imagen = new Imagen; | |
try | |
{ | |
JFrame f = new JFrame(nombre); | |
f.addWindowListener(new WindowAdapter() | |
{ | |
@Override | |
public void windowClosing(WindowEvent e) | |
{} | |
} | |
); | |
f.add(img); | |
f.pack(); | |
f.setVisible(true); | |
f.repaint(); | |
} | |
catch (Exception e) | |
{ | |
} | |
} | |
public double[][] getMatrizImg() { | |
return matrizImg; | |
} | |
public int getColumnas() { | |
return columnas; | |
} | |
public int getFilas() { | |
return filas; | |
} | |
public BufferedImage getImg() { | |
return img; | |
} | |
public double[][] getMatrizImg_B() { | |
return matrizImg_B; | |
} | |
public double[][] getMatrizImg_G() { | |
return matrizImg_G; | |
} | |
public double[][] getMatrizImg_R() { | |
return matrizImg_R; | |
} | |
public void setColumnas(int columnas) { | |
this.columnas = columnas; | |
} | |
public void setFilas(int filas) { | |
this.filas = filas; | |
} | |
public void setMatrizImg(double[][] matrizImg) { | |
this.matrizImg = matrizImg; | |
} | |
public void setImg(BufferedImage img) { | |
this.img=img; | |
} | |
public void setMatrizImg_B(double[][] matrizImg_B) { | |
this.matrizImg_B = matrizImg_B; | |
} | |
public void setMatrizImg_G(double[][] matrizImg_G) { | |
this.matrizImg_G = matrizImg_G; | |
} | |
public void setMatrizImg_R(double[][] matrizImg_R) { | |
this.matrizImg_R = matrizImg_R; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment