Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package sk.paz1b.practicals.task5;
- import java.awt.*;
- import java.awt.image.*;
- import java.io.*;
- import java.util.Arrays;
- import java.util.LinkedList;
- import java.util.Queue;
- import javax.imageio.*;
- public class AnalyzatorSkenu2 {
- /**
- * Privatna na ulozenie suradnic pixelu (riadok, stlpec)
- */
- private static class Pixel {
- int riadok;
- int stlpec;
- public Pixel(int riadok, int stlpec) {
- this.riadok = riadok;
- this.stlpec = stlpec;
- }
- }
- /**
- * Naskenovany obrazok
- */
- private BufferedImage obrazok;
- /**
- * Sirka nacitaneho obrazka
- */
- private int sirka;
- /**
- * Vyska nacitaneho obrazka
- */
- private int vyska;
- /**
- * Hustota buniek - podiel plochy pokrytej bunkami k ploche skenu
- */
- private double hustotaBuniek;
- private int pocetBuniek;
- private boolean[][] poleBunky;
- private int[][] smery = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } };
- /**
- * Vytvori novy analyzator skenu buniek a spusti zakladnu analyzu
- *
- * @param nazovSuboru nazov suboru so skenom buniek
- */
- public AnalyzatorSkenu2(String nazovSuboru) {
- try {
- obrazok = ImageIO.read(new File(nazovSuboru));
- sirka = obrazok.getWidth();
- vyska = obrazok.getHeight();
- } catch (IOException e) {
- System.err.println("Subor " + nazovSuboru + " sa nepodarilo nacitat.");
- }
- analyzuj();
- }
- /**
- * Vrati, ci je pixel na suradniciach [x, y] pixelom bunky.
- */
- private boolean jePixelBunky(int x, int y) {
- Color pixel = new Color(obrazok.getRGB(x, y));
- return !pixel.equals(Color.black);
- }
- /**
- * Vypocita hustotu buniek
- */
- private void vypocitajHustotuBuniek() {
- int pocetBunkovychPixelov = 0;
- for (int y = 0; y < vyska; y++)
- for (int x = 0; x < sirka; x++)
- if (jePixelBunky(x, y))
- pocetBunkovychPixelov++;
- hustotaBuniek = pocetBunkovychPixelov / ((double) sirka * vyska);
- }
- /**
- * Realizuje zakladnu analyzu obrazka so skenom buniek
- */
- private void analyzuj() {
- vypocitajHustotuBuniek();
- poleBunky = new boolean[sirka][vyska];
- for (int y = 0; y <= vyska - 1; y++)
- for (int x = 0; x <= sirka - 1; x++) {
- if (jePixelBunky(x, y)) {
- poleBunky[x][y] = true;
- }
- }
- for (int y = 0; y <= vyska - 1; y++)
- for (int x = 0; x <= sirka - 1; x++) {
- if (poleBunky[x][y]) {
- pocetBuniek++;
- Pixel p = new Pixel(x, y);
- pixelPatriBunke(p);
- }
- }
- }
- private boolean somVRozsahu(Pixel pixel) {
- if (pixel.riadok >= 0 && pixel.riadok < vyska - 1 && pixel.stlpec >= 0 && pixel.stlpec < sirka - 1) {
- return true;
- }
- return false;
- }
- public void pixelPatriBunke(Pixel start) {
- Queue<Pixel> rad = new LinkedList<Pixel>();
- rad.offer(start);
- while (!rad.isEmpty()) {
- Pixel pixelBunky = rad.poll();
- if (somVRozsahu(pixelBunky)) {
- for (int smer = 0; smer < 8; smer++) {
- Pixel sused = new Pixel(pixelBunky.riadok + smery[smer][0], pixelBunky.stlpec + smery[smer][1]);
- if (somVRozsahu(sused)) {
- if ((poleBunky[sused.riadok][sused.stlpec] == true)) {
- //na tomto mieste to vzdy hodi error indexOutOfBoundsException: 600
- poleBunky[sused.riadok][sused.stlpec] = false;
- rad.offer(sused);
- }
- }
- }
- }
- }
- }
- /**
- * Vrati pocet buniek na obrazku
- */
- public int getPocetBuniek() {
- return pocetBuniek;
- }
- /**
- * Vrati hustotu buniek (pomer bunkovych pixelov k vsetkym pixelom)
- */
- public double getHustotaBuniek() {
- return hustotaBuniek;
- }
- public static void main(String[] args) {
- AnalyzatorSkenu2 analyzator = new AnalyzatorSkenu2("SkenBuniek03.png");
- System.out.println("Hustota buniek: " + (analyzator.getHustotaBuniek() * 100) + " %");
- System.out.println("Pocet buniek: " + analyzator.getPocetBuniek());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement