Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. package sk.paz1b.practicals.task5;
  2.  
  3. import java.awt.*;
  4. import java.awt.image.*;
  5. import java.io.*;
  6. import java.util.Arrays;
  7. import java.util.LinkedList;
  8. import java.util.Queue;
  9.  
  10. import javax.imageio.*;
  11.  
  12. public class AnalyzatorSkenu2 {
  13.  
  14. /**
  15. * Privatna na ulozenie suradnic pixelu (riadok, stlpec)
  16. */
  17. private static class Pixel {
  18. int riadok;
  19. int stlpec;
  20.  
  21. public Pixel(int riadok, int stlpec) {
  22. this.riadok = riadok;
  23. this.stlpec = stlpec;
  24. }
  25. }
  26.  
  27. /**
  28. * Naskenovany obrazok
  29. */
  30. private BufferedImage obrazok;
  31.  
  32. /**
  33. * Sirka nacitaneho obrazka
  34. */
  35. private int sirka;
  36.  
  37. /**
  38. * Vyska nacitaneho obrazka
  39. */
  40. private int vyska;
  41.  
  42. /**
  43. * Hustota buniek - podiel plochy pokrytej bunkami k ploche skenu
  44. */
  45. private double hustotaBuniek;
  46.  
  47. private int pocetBuniek;
  48.  
  49. private boolean[][] poleBunky;
  50.  
  51. private int[][] smery = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } };
  52.  
  53. /**
  54. * Vytvori novy analyzator skenu buniek a spusti zakladnu analyzu
  55. *
  56. * @param nazovSuboru nazov suboru so skenom buniek
  57. */
  58. public AnalyzatorSkenu2(String nazovSuboru) {
  59. try {
  60. obrazok = ImageIO.read(new File(nazovSuboru));
  61. sirka = obrazok.getWidth();
  62. vyska = obrazok.getHeight();
  63.  
  64. } catch (IOException e) {
  65. System.err.println("Subor " + nazovSuboru + " sa nepodarilo nacitat.");
  66. }
  67.  
  68. analyzuj();
  69. }
  70.  
  71. /**
  72. * Vrati, ci je pixel na suradniciach [x, y] pixelom bunky.
  73. */
  74. private boolean jePixelBunky(int x, int y) {
  75. Color pixel = new Color(obrazok.getRGB(x, y));
  76. return !pixel.equals(Color.black);
  77. }
  78.  
  79. /**
  80. * Vypocita hustotu buniek
  81. */
  82. private void vypocitajHustotuBuniek() {
  83. int pocetBunkovychPixelov = 0;
  84. for (int y = 0; y < vyska; y++)
  85. for (int x = 0; x < sirka; x++)
  86. if (jePixelBunky(x, y))
  87. pocetBunkovychPixelov++;
  88.  
  89. hustotaBuniek = pocetBunkovychPixelov / ((double) sirka * vyska);
  90. }
  91.  
  92. /**
  93. * Realizuje zakladnu analyzu obrazka so skenom buniek
  94. */
  95. private void analyzuj() {
  96. vypocitajHustotuBuniek();
  97. poleBunky = new boolean[sirka][vyska];
  98. for (int y = 0; y <= vyska - 1; y++)
  99. for (int x = 0; x <= sirka - 1; x++) {
  100. if (jePixelBunky(x, y)) {
  101. poleBunky[x][y] = true;
  102. }
  103. }
  104.  
  105. for (int y = 0; y <= vyska - 1; y++)
  106. for (int x = 0; x <= sirka - 1; x++) {
  107. if (poleBunky[x][y]) {
  108. pocetBuniek++;
  109. Pixel p = new Pixel(x, y);
  110. pixelPatriBunke(p);
  111.  
  112. }
  113. }
  114. }
  115.  
  116. private boolean somVRozsahu(Pixel pixel) {
  117. if (pixel.riadok >= 0 && pixel.riadok < vyska - 1 && pixel.stlpec >= 0 && pixel.stlpec < sirka - 1) {
  118. return true;
  119. }
  120. return false;
  121. }
  122.  
  123. public void pixelPatriBunke(Pixel start) {
  124. Queue<Pixel> rad = new LinkedList<Pixel>();
  125. rad.offer(start);
  126. while (!rad.isEmpty()) {
  127. Pixel pixelBunky = rad.poll();
  128. if (somVRozsahu(pixelBunky)) {
  129. for (int smer = 0; smer < 8; smer++) {
  130. Pixel sused = new Pixel(pixelBunky.riadok + smery[smer][0], pixelBunky.stlpec + smery[smer][1]);
  131. if (somVRozsahu(sused)) {
  132. if ((poleBunky[sused.riadok][sused.stlpec] == true)) {
  133. //na tomto mieste to vzdy hodi error indexOutOfBoundsException: 600
  134. poleBunky[sused.riadok][sused.stlpec] = false;
  135. rad.offer(sused);
  136. }
  137. }
  138.  
  139. }
  140. }
  141. }
  142.  
  143. }
  144.  
  145. /**
  146. * Vrati pocet buniek na obrazku
  147. */
  148. public int getPocetBuniek() {
  149. return pocetBuniek;
  150. }
  151.  
  152. /**
  153. * Vrati hustotu buniek (pomer bunkovych pixelov k vsetkym pixelom)
  154. */
  155. public double getHustotaBuniek() {
  156. return hustotaBuniek;
  157. }
  158.  
  159. public static void main(String[] args) {
  160. AnalyzatorSkenu2 analyzator = new AnalyzatorSkenu2("SkenBuniek03.png");
  161. System.out.println("Hustota buniek: " + (analyzator.getHustotaBuniek() * 100) + " %");
  162. System.out.println("Pocet buniek: " + analyzator.getPocetBuniek());
  163.  
  164. }
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement