Java DIP - Kurzanleitung

Die digitale Bildverarbeitung (DIP) befasst sich mit der Manipulation digitaler Bilder unter Verwendung eines digitalen Computers. Es ist ein Teilfeld von Signalen und Systemen, konzentriert sich jedoch insbesondere auf Bilder. DIP konzentriert sich auf die Entwicklung eines Computersystems, das die Verarbeitung eines Bildes durchführen kann. Die Eingabe eines solchen Systems ist ein digitales Bild. Das System verarbeitet das Bild unter Verwendung effizienter Algorithmen und gibt ein Bild als Ausgabe aus.

Java ist eine Programmiersprache auf hohem Niveau, die in der modernen Welt weit verbreitet ist. Es kann die digitale Bildverarbeitung mithilfe verschiedener Funktionen effizient unterstützen und handhaben.

Die Java- BufferedImageKlasse ist eine Unterklasse der Image-Klasse. Es wird verwendet, um die Bilddaten zu verarbeiten und zu bearbeiten. A BufferedImagebesteht aus ColorModel von Bilddaten. Alle BufferedImageObjekte haben eine obere linke Eckkoordinate von (0, 0).

Konstruktoren

Diese Klasse unterstützt drei Arten von Konstruktoren.

Der erste Konstruktor erstellt ein neues BufferedImagemit einem angegebenen ColorModel und Raster.

BufferedImage(ColorModel cm, WritableRaster raster, 
boolean isRasterPremultiplied, Hashtable<?,?> properties)

Der zweite Konstruktor erstellt BufferedImageeinen der vordefinierten Bildtypen.

BufferedImage(int width, int height, int imageType)

Der dritte Konstruktor erstellt BufferedImageeinen der vordefinierten Bildtypen: TYPE_BYTE_BINARY oder TYPE_BYTE_INDEXED.

BufferedImage(int width, int height, int imageType, IndexColorModel cm)

Sr.Nr. Methode & Beschreibung
1

copyData(WritableRaster outRaster)

Es berechnet einen beliebigen rechteckigen Bereich von BufferedImageund kopiert ihn in ein angegebenes WritableRaster.

2

getColorModel()

Es gibt ein Objekt der Klasse ColorModel eines Bildes zurück.

3

getData()

Das Bild wird als eine große Kachel zurückgegeben.

4

getData(Rectangle rect)

Es berechnet und gibt einen beliebigen Bereich des zurück BufferedImage.

5

getGraphics()

Diese Methode gibt eine Graphics2D zurück und behält die Abwärtskompatibilität bei.

6

getHeight()

Es gibt die Höhe des zurück BufferedImage.

7

getMinX()

Es gibt die minimale x-Koordinate davon zurück BufferedImage.

8

getMinY()

Es gibt die minimale y-Koordinate davon zurück BufferedImage.

9

getRGB(int x, int y)

Es gibt ein ganzzahliges Pixel im Standard-RGB-Farbmodell (TYPE_INT_ARGB) und im Standard-sRGB-Farbraum zurück.

10

getType()

Es gibt den Bildtyp zurück.

Beispiel

Das folgende Beispiel zeigt die Verwendung einer Java- BufferedImageKlasse, die mithilfe von Grafikobjekt Text auf dem Bildschirm zeichnet.

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JPanel {

   public void paint(Graphics g) {
      Image img = createImageWithText();
      g.drawImage(img, 20,20,this);
   }

   private Image createImageWithText() {
      BufferedImage bufferedImage = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
      Graphics g = bufferedImage.getGraphics();

      g.drawString("www.tutorialspoint.com", 20,20);
      g.drawString("www.tutorialspoint.com", 20,40);
      g.drawString("www.tutorialspoint.com", 20,60);
      g.drawString("www.tutorialspoint.com", 20,80);
      g.drawString("www.tutorialspoint.com", 20,100);
      
      return bufferedImage;
   }
   
   public static void main(String[] args) {
      JFrame frame = new JFrame();
      frame.getContentPane().add(new Test());

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(200, 200);
      frame.setVisible(true);
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

In diesem Kapitel erfahren Sie, wie Sie ein Bild aus dem Internet herunterladen, einige Bildverarbeitungstechniken für das Bild ausführen und das verarbeitete Bild dann erneut auf einen Server hochladen können.

Ein Bild herunterladen

Um ein Bild von einer Website herunterzuladen, verwenden wir die Java-Klasse mit dem Namen URL, die unter zu finden sind java.netPaket. Die Syntax ist unten angegeben -

String website = "http://tutorialspoint.com";
URL url = new URL(website);

Abgesehen von der obigen Methode stehen in der Klassen-URL andere Methoden zur Verfügung, wie kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

public String getPath()

Es gibt den Pfad der URL zurück.

2

public String getQuery()

Es gibt den Abfrageteil der URL zurück.

3

public String getAuthority()

Es gibt die Autorität der URL zurück.

4

public int getPort()

Es gibt den Port der URL zurück.

5

public int getDefaultPort()

Es gibt den Standardport für das Protokoll der URL zurück.

6

public String getProtocol()

Es gibt das Protokoll der URL zurück.

7

public String getHost()

Es gibt den Host der URL zurück.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Java-URL-Klasse zum Herunterladen eines Bildes aus dem Internet.

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import java.net.URL;

public class Download {

   public static void main(String[] args) throws Exception {
   
      try{
         String fileName = "digital_image_processing.jpg";
         String website = "http://tutorialspoint.com/java_dip/images/"+fileName;
         
         System.out.println("Downloading File From: " + website);
         
         URL url = new URL(website);
         InputStream inputStream = url.openStream();
         OutputStream outputStream = new FileOutputStream(fileName);
         byte[] buffer = new byte[2048];
         
         int length = 0;
         
         while ((length = inputStream.read(buffer)) != -1) {
            System.out.println("Buffer Read of length: " + length);
            outputStream.write(buffer, 0, length);
         }
         
         inputStream.close();
         outputStream.close();
         
      } catch(Exception e) {
         System.out.println("Exception: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie die oben angegebene Ausführung ausführen, wird die folgende Ausgabe angezeigt.

Das folgende Bild wird vom Server heruntergeladen.

Ein Bild hochladen

Lassen Sie uns sehen, wie Sie ein Bild auf einen Webserver hochladen. Wir konvertieren ein BufferedImage in ein Byte-Array, um es an den Server zu senden.

Wir verwenden die Java-Klasse ByteArrayOutputStream, die unter zu finden sind java.ioPaket. Die Syntax ist unten angegeben -

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);

Um das Bild in ein Byte-Array zu konvertieren, verwenden wir toByteArray() Methode von ByteArrayOutputStreamKlasse. Die Syntax ist unten angegeben -

byte[] bytes = baos.toByteArray();

Abgesehen von der obigen Methode stehen in der ByteArrayOutputStream-Klasse weitere Methoden zur Verfügung, wie kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

public void reset()

Diese Methode setzt die Anzahl der gültigen Bytes des Byte-Array-Ausgabestreams auf Null zurück, sodass alle im Stream akkumulierten Ausgaben verworfen werden.

2

public byte[] toByteArray()

Diese Methode erstellt ein neu zugewiesenes Byte-Array. Seine Größe entspricht der aktuellen Größe des Ausgabestreams, und der Inhalt des Puffers wird in diesen kopiert. Es gibt den aktuellen Inhalt des Ausgabestreams als Byte-Array zurück.

3

public String toString()

Konvertiert den Pufferinhalt in eine Zeichenfolge. Die Übersetzung erfolgt gemäß der Standard-Zeichenkodierung. Es gibt den aus dem Inhalt des Puffers übersetzten String zurück.

4

public void write(int w)

Es schreibt das angegebene Array in den Ausgabestream.

5

public void write(byte []b, int of, int len)

Es schreibt die Anzahl der Bytes ab dem Offset in den Stream.

6

public void writeTo(OutputStream outSt)

Es schreibt den gesamten Inhalt dieses Streams in das angegebene Stream-Argument.

Beispiel

Das folgende Beispiel zeigt, wie ByteArrayOutputStream ein Bild auf den Server hochlädt.

Kundencode

import javax.swing.*;  
import java.net.*; 
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Client{
   public static void main(String args[]) throws Exception{
   
      Socket soc;
      BufferedImage img = null;
      soc=new Socket("localhost",4000);
      System.out.println("Client is running. ");
      
      try {
         System.out.println("Reading image from disk. ");
         img = ImageIO.read(new File("digital_image_processing.jpg"));
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         
         ImageIO.write(img, "jpg", baos);
         baos.flush();
         
         byte[] bytes = baos.toByteArray();
         baos.close();
         
         System.out.println("Sending image to server. ");
         
         OutputStream out = soc.getOutputStream(); 
         DataOutputStream dos = new DataOutputStream(out);
         
         dos.writeInt(bytes.length);
         dos.write(bytes, 0, bytes.length);
         
         System.out.println("Image sent to server. ");

         dos.close();
         out.close();
         
      } catch (Exception e) {
         System.out.println("Exception: " + e.getMessage());
         soc.close();
      }
      soc.close();
   }
}

Servercode

import java.net.*;
import java.io.*;
import java.awt.image.*;

import javax.imageio.*; 
import javax.swing.*; 

class Server {
   public static void main(String  args[]) throws Exception{
      ServerSocket server=null;
      Socket socket;
      server = new ServerSocket(4000);
      System.out.println("Server Waiting for image");

      socket = server.accept();
      System.out.println("Client connected.");
      
      InputStream in = socket.getInputStream();
      DataInputStream dis = new DataInputStream(in);

      int len = dis.readInt();
      System.out.println("Image Size: " + len/1024 + "KB");
      
      byte[] data = new byte[len];
      dis.readFully(data);
      dis.close();
      in.close();

      InputStream ian = new ByteArrayInputStream(data);
      BufferedImage bImage = ImageIO.read(ian);
 
      JFrame f = new JFrame("Server");
      ImageIcon icon = new ImageIcon(bImage);
      JLabel l = new JLabel();
      
      l.setIcon(icon);
      f.add(l);
      f.pack();
      f.setVisible(true);
   }
}

Ausgabe

Clientseitige Ausgabe

Wenn Sie den Clientcode ausführen, wird die folgende Ausgabe auf der Clientseite angezeigt:

Serverseitige Ausgabe

Wenn Sie den Servercode ausführen, wird auf der Serverseite der folgende Befehl angezeigt:

Nach dem Empfang des Bildes zeigt der Server das Bild wie folgt an:

Ein Bild enthält eine zweidimensionale Anordnung von Pixeln. Es ist tatsächlich der Wert dieser Pixel, aus denen ein Bild besteht. Normalerweise kann ein Bild Farbe oder Graustufen sein.

In Java wird die BufferedImage-Klasse zum Behandeln von Bildern verwendet. Sie müssen anrufengetRGB() Methode der BufferedImage Klasse, um den Wert des Pixels zu erhalten.

Pixelwert abrufen

Der Pixelwert kann mit der folgenden Syntax empfangen werden

Color c = new Color(image.getRGB(j, i));

RGB-Werte abrufen

Die Methode getRGB()Nimmt den Zeilen- und Spaltenindex als Parameter und gibt das entsprechende Pixel zurück. Bei Farbbildern werden drei Werte zurückgegeben: Rot, Grün, Blau. Sie können wie folgt erhalten werden

c.getRed();
c.getGreen();
c.getBlue();

Breite und Höhe des Bildes ermitteln

Die Höhe und Breite des Bildes kann durch Aufrufen von ermittelt werden getWidth() und getHeight()Methoden der BufferedImage-Klasse. Die Syntax ist unten angegeben

int width = image.getWidth();
int height = image.getHeight();

Neben diesen Methoden werden in der BufferedImage-Klasse noch andere Methoden unterstützt. Sie werden kurz beschrieben

Sr.Nr. Methode & Beschreibung
1

copyData(WritableRaster outRaster)

Es berechnet einen beliebigen rechteckigen Bereich des BufferedImage und kopiert ihn in ein angegebenes WritableRaster.

2

getColorModel()

Es gibt ColorModel eines Bildes zurück.

3

getData()

Das Bild wird als eine große Kachel zurückgegeben.

4

getData(Rectangle rect)

Es berechnet und gibt einen beliebigen Bereich des BufferedImage zurück.

5

getGraphics()

Diese Methode gibt eine Graphics2D zurück, dient jedoch der Abwärtskompatibilität.

6

getHeight()

Es gibt die Höhe des BufferedImage zurück.

7

getMinX()

Es gibt die minimale x-Koordinate dieses BufferedImage zurück.

8

getMinY()

Es gibt die minimale y-Koordinate dieses BufferedImage zurück.

9

getRGB(int x, int y)

Es gibt ein ganzzahliges Pixel im Standard-RGB-Farbmodell (TYPE_INT_ARGB) und im Standard-sRGB-Farbraum zurück.

10

getType()

Es gibt den Bildtyp zurück.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Java-Klasse BufferedImage, die Pixel eines Bildes mit einer Größe (100 x 100) anzeigt.

import java.awt.*;
import java.awt.image.BufferedImage;

import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

class Pixel {
   BufferedImage image;
   int width;
   int height;
   
   public Pixel() {
      try {
         File input = new File("blackandwhite.jpg");
         image = ImageIO.read(input);
         width = image.getWidth();
         height = image.getHeight();
         
         int count = 0;
         
         for(int i=0; i<height; i++) {
         
            for(int j=0; j<width; j++) {
            
               count++;
               Color c = new Color(image.getRGB(j, i));
               System.out.println("S.No: " + count + " Red: " + c.getRed() +"  Green: " + c.getGreen() + " Blue: " + c.getBlue());
            }
         }

      } catch (Exception e) {}
   }
   
   static public void main(String args[]) throws Exception {
      Pixel obj = new Pixel();
   }
}

Ausgabe

Wenn Sie das obige Beispiel ausführen, werden die Pixel des folgenden Bilds gedruckt -

Original Image

Pixels Output

Wenn Sie in der Ausgabe nach unten scrollen, wird das folgende Muster angezeigt

Um ein Farbbild in ein Graustufenbild umzuwandeln, müssen Sie Pixel oder Daten des Bildes mit lesen File und ImageIO Objekte und speichern Sie das Bild in BufferedImageObjekt. Die Syntax ist unten angegeben -

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);

Ermitteln Sie außerdem den Pixelwert mithilfe der Methode getRGB()und führen Sie die GrayScale () -Methode darauf aus. Die Methode getRGB () verwendet den Zeilen- und Spaltenindex als Parameter.

Color c = new Color(image.getRGB(j, i));
int red = (c.getRed() * 0.299);
int green =(c.getGreen() * 0.587);
int blue = (c.getBlue() *0.114);

Abgesehen von diesen drei Methoden stehen in der Farbklasse weitere Methoden zur Verfügung, die kurz beschrieben werden.

Sr.Nr. Methode & Beschreibung
1

brighter()

Es wird eine neue Farbe erstellt, die eine hellere Version dieser Farbe ist.

2

darker()

Es wird eine neue Farbe erstellt, die eine dunklere Version dieser Farbe ist.

3

getAlpha()

Es gibt die Alpha-Komponente im Bereich von 0 bis 255 zurück.

4

getHSBColor(float h, float s, float b)

Es wird ein Farbobjekt basierend auf den angegebenen Werten für das HSB-Farbmodell erstellt.

5

HSBtoRGB(float hue, float saturation, float brightness)

Es konvertiert die Komponenten einer Farbe, wie vom HSB-Modell angegeben, in einen äquivalenten Wertesatz für das Standard-RGB-Modell.

6

toString()

Es wird eine Zeichenfolgendarstellung dieser Farbe zurückgegeben.

Der letzte Schritt besteht darin, alle diese drei Werte zu addieren und erneut auf den entsprechenden Pixelwert zu setzen. Die Syntax ist unten angegeben -

int sum = red+green+blue;
Color newColor = new Color(sum,sum,sum);
image.setRGB(j,i,newColor.getRGB());

Beispiel

Das folgende Beispiel zeigt die Verwendung der Java BufferedImage-Klasse, die ein Bild in Graustufen konvertiert.

import java.awt.*;
import java.awt.image.BufferedImage;

import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class GrayScale {

   BufferedImage  image;
   int width;
   int height;
   
   public GrayScale() {
   
      try {
         File input = new File("digital_image_processing.jpg");
         image = ImageIO.read(input);
         width = image.getWidth();
         height = image.getHeight();
         
         for(int i=0; i<height; i++) {
         
            for(int j=0; j<width; j++) {
            
               Color c = new Color(image.getRGB(j, i));
               int red = (int)(c.getRed() * 0.299);
               int green = (int)(c.getGreen() * 0.587);
               int blue = (int)(c.getBlue() *0.114);
               Color newColor = new Color(red+green+blue,
               
               red+green+blue,red+green+blue);
               
               image.setRGB(j,i,newColor.getRGB());
            }
         }
         
         File ouptut = new File("grayscale.jpg");
         ImageIO.write(image, "jpg", ouptut);
         
      } catch (Exception e) {}
   }
   
   static public void main(String args[]) throws Exception {
      GrayScale obj = new GrayScale();
   }
}

Ausgabe

Wenn Sie das angegebene Beispiel ausführen, wird das Bild konvertiert digital_image_processing.jpg auf das entsprechende Graustufen-Image und schreiben Sie es mit dem Namen auf die Festplatte grayscale.jpg.

Original Bild

Graustufenbild

In diesem Kapitel erfahren Sie, wie Sie den Kontrast eines Bildes mithilfe der Histogramm-Entzerrung verbessern.

Wir nehmen das OpenCV Funktion equalizeHist()Methode. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

Imgproc.equalizeHist(source, destination);

Die Parameter werden unten beschrieben -

Sr.Nr. Parameter & Beschreibung
1

Source

Es ist ein 8-Bit-Einkanal-Quellbild.

2

Destination

Es ist das Zielbild.

Neben der Methode equizeHist () gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse, um den Kontrast eines Bildes zu verbessern.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {

   static int width;
   static int height;
   static double alpha = 2;
   static double beta = 50;
   
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("grayscale.jpg", 
         Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Imgproc.equalizeHist(source, destination);
         Highgui.imwrite("contrast.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Verbessertes Kontrastbild

In diesem Kapitel verbessern wir die Helligkeit eines Bildes, indem wir jedes Pixel des Bildes mit einem Alpha-Wert multiplizieren und einen weiteren Beta-Wert hinzufügen.

Wir OpenCV Funktion convertTodas macht den obigen Vorgang automatisch. Es kann unter gefunden werdenMatPaket. Die Syntax ist unten angegeben -

int alpha = 2;
int beta = 50;
sourceImage.convertTo(destination, rtype , alpha, beta);

Die Parameter werden unten beschrieben -

Sr.Nr. Parameter & Beschreibung
1

destination

Es ist ein Zielbild.

2

rtype

Es ist der gewünschte Ausgangsmatrixtyp oder vielmehr die Tiefe, da die Anzahl der Kanäle der des Eingangs entspricht. Wenn rtype negativ ist, hat die Ausgabematrix den gleichen Typ wie die Eingabe.

3

alpha

Dies ist ein optionaler Skalierungsfaktor.

4

beta

Es ist ein optionales Delta, das zu den skalierten Werten hinzugefügt wird.

Neben der convertTo-Methode gibt es weitere Methoden, die von der Mat-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

adjustROI(int dtop, int dbottom, int dleft, int dright)

Es passt die Größe und Position einer Submatrix innerhalb der übergeordneten Matrix an.

2

copyTo(Mat m)

Es kopiert die Matrix in eine andere.

3

diag()

Es extrahiert eine Diagonale aus einer Matrix oder erstellt eine Diagonalmatrix.

4

dot(Mat m)

Es berechnet ein Punktprodukt aus zwei Vektoren.

5

reshape(int cn)

Es ändert die Form und / oder die Anzahl der Kanäle einer 2D-Matrix, ohne die Daten zu kopieren.

6

submat(Range rowRange, Range colRange)

Es extrahiert eine rechteckige Untermatrix.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Mat-Klasse zur Verbesserung der Helligkeit eines Bildes.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;

public class Main {
   static int width;
   static int height;
   static double alpha = 2;
   static double beta = 50;
   
   public static void main( String[] args ) {
   
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source =  Highgui.imread("digital_image_processing.jpg",Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),
         
         source.type());
         source.convertTo(destination, -1, alpha, beta);
         Highgui.imwrite("brightWithAlpha2Beta50.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error:" + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Verbessertes helles Bild (Alpha = 1 & Beta = 50)

Verbessertes helles Bild (Alpha = 2 & Beta = 50)

In diesem Kapitel lernen wir, die Schärfe eines Bildes mithilfe des Gaußschen Filters zu erhöhen.

Zuerst benutzen wir OpenCV Funktion GaussianBlur. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

Imgproc.GaussianBlur(source, destination, new Size(0,0), sigmaX);

Die Parameter werden kurz beschrieben -

Sr.Nr. Parameter & Beschreibung
1

source

Es ist ein Quellbild.

2

destination

Es ist ein Zielbild.

3

Size

Es ist die Gaußsche Kernelgröße.

4

sigmaX

Es ist die Standardabweichung des Gaußschen Kernels in X-Richtung.

Weiter verwenden wir OpenCV Funktion addWeightedum ein Bildwasserzeichen auf das Bild anzuwenden. Es kann unter gefunden werdenCorePaket. Die Syntax ist unten angegeben -

Core.addWeighted(InputArray src1, alpha, src2, beta, gamma, OutputArray dst);

Die Parameter dieser Funktion werden nachfolgend beschrieben -

Sr.Nr. Parameter & Beschreibung
1

src1

Es ist das erste Eingabearray.

2

alpha

Es ist das Gewicht der ersten Array-Elemente.

3

src2

Es ist das zweite Eingangsarray mit der gleichen Größe und Kanalnummer wie src1.

4

Beta

Es ist das Gewicht der zweiten Array-Elemente.

5

gamma

Es wird zu jeder Summe skalar addiert.

6

dst

Es ist ein Ausgabearray mit der gleichen Größe und Anzahl von Kanälen wie die Eingabearrays.

Neben der GaussianBlur-Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc- und Core-Klasse zum Anwenden des Schärfens auf ein Bild.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",
         Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         Imgproc.GaussianBlur(source, destination, new Size(0,0), 10);
         Core.addWeighted(source, 1.5, destination, -0.5, 0, destination);
         Highgui.imwrite("sharp.jpg", destination);
      } catch (Exception e) {
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Scharfes Bild

Ein Bild kann einfach über Java komprimiert und gespeichert werden. Bei der Komprimierung eines Bildes wird ein Bild in JPG konvertiert und gespeichert.

Um ein Bild zu komprimieren, lesen wir das Bild und konvertieren es in ein BufferedImage-Objekt.

Außerdem erhalten wir einen ImageWriter von getImageWritersByFormatName()Methode in der ImageIO-Klasse gefunden. Erstellen Sie mit diesem ImageWriter eineImageWriteParamObjekt. Die Syntax ist unten angegeben -

Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();

In diesem ImageWriteParam-Objekt können Sie die Komprimierung festlegen, indem Sie diese beiden Methoden aufrufen setCompressionMode() und setCompressionQuality(). Ihre Syntax ist wie folgt:

obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);

Die Methode setCompressionMode () verwendet Mode_EXPLICIT als Parameter. Einige der anderen Modi werden kurz beschrieben -

Sr.Nr. Modi
1

MODE_DEFAULT

Es ist ein konstanter Wert, der an Methoden übergeben werden kann, um diese Funktion für zukünftige Schreibvorgänge zu aktivieren.

2

MODE_DISABLED

Es ist ein konstanter Wert, der an Methoden übergeben werden kann, um diese Funktion für zukünftige Schreibvorgänge zu deaktivieren.

3

MODE_EXPLICIT

Es ist ein konstanter Wert, der an Methoden übergeben werden kann, um diese Funktion für zukünftige Schreibvorgänge zu aktivieren.

Neben den Komprimierungsmethoden gibt es noch andere Methoden, die von der ImageWriteParam-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

canOffsetTiles()

Es gibt true zurück, wenn der Writer beim Schreiben Kacheln mit Rasterversätzen ungleich Null durchführen kann.

2

getBitRate(float quality)

Es gibt einen Gleitkommawert zurück, der eine Schätzung der Anzahl von Bits von Ausgabedaten für jedes Bit von Eingabebilddaten bei der gegebenen Qualitätsstufe angibt.

3

getLocale()

Es gibt das aktuell festgelegte Gebietsschema zurück oder null, wenn nur ein Standardgebietsschema unterstützt wird.

4

isCompressionLossless()

Es gibt true zurück, wenn der aktuelle Komprimierungstyp eine verlustfreie Komprimierung bietet.

5

unsetCompression()

Alle vorherigen Einstellungen für Komprimierungstyp und -qualität werden entfernt.

6

unsetTiling()

Es entfernt alle vorherigen Kachelgitterparameter, die durch Aufrufe von setTiling angegeben wurden.

Beispiel

Das folgende Beispiel zeigt die Verwendung der ImageWriteParam-Klasse zum Komprimieren eines Bildes.

import java.io.*;
import java.util.*;
import java.awt.image.*;

import javax.imageio.*;
import javax.imageio.stream.ImageOutputStream;

class Compression {

   public static void main(String[] args) throws IOException {
   
      File input = new File("digital_image_processing.jpg");
      BufferedImage image = ImageIO.read(input);

      File compressedImageFile = new File("compress.jpg");
      OutputStream os =new FileOutputStream(compressedImageFile);

      Iterator<ImageWriter>writers =  ImageIO.getImageWritersByFormatName("jpg");
      ImageWriter writer = (ImageWriter) writers.next();

      ImageOutputStream ios = ImageIO.createImageOutputStream(os);
      writer.setOutput(ios);

      ImageWriteParam param = writer.getDefaultWriteParam();
      
      param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
      param.setCompressionQuality(0.05f);
      writer.write(null, new IIOImage(image, null, null), param);
      
      os.close();
      ios.close();
      writer.dispose();
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird das Bild komprimiert digital_image_processing.jpg auf das entsprechende komprimierte Image und schreibt es mit dem Namen auf die Festplatte compress.jpg.

Original Bild

Komprimiertes Bild - Qualitätsfaktor - 0,05

Komprimiertes Bild - Qualitätsfaktor - 0,5

In diesem Kapitel lernen wir, einem Bild verschiedene Arten von Rahmen hinzuzufügen.

Wir gebrauchen OpenCV Funktion copyMakeBorder. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

Imgproc.copyMakeBorder(source,destination,top,bottom,left,right,borderType);

Die Parameter werden unten beschrieben -

Sr.Nr. Parameter & Beschreibung
1

source

Es ist ein Quellbild.

2

destination

Es ist ein Zielbild.

3

top

Dies ist die Länge des Rahmens in Pixel oben im Bild.

4

bottom

Länge in Pixel des Rahmens am unteren Bildrand.

5

left

Dies ist die Länge des Rahmens links im Bild in Pixel.

6

right

Dies ist die Länge des Rahmens rechts im Bild in Pixel.

7

borderType

Es definiert die Art der Grenze. Die möglichen Grenzen sind BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_CONSTANT usw.

Neben der copyMakeBorder () -Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Hinzufügen eines Rahmens zu einem Bild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class main {
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",
         
         Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         int top, bottom, left, right;
         int borderType;

         /// Initialize arguments for the filter
         top = (int) (0.05*source.rows()); 
         bottom = (int) (0.05*source.rows());
         left = (int) (0.05*source.cols()); 
         right = (int) (0.05*source.cols());

         destination = source;
         Imgproc.copyMakeBorder(source, destination, top, bottom, left, right, Imgproc.BORDER_WRAP);
         Highgui.imwrite("borderWrap.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Isoliertes Randbild

Eingewickeltes Randbild

Randbild reflektieren

Die Bildpyramide ist nichts anderes als eine Methode zum Anzeigen eines Bildes mit mehreren Auflösungen. Die unterste Ebene ist eine Version des Bildes mit der höchsten Auflösung und die oberste Ebene ist eine Version des Bildes mit der niedrigsten Auflösung. Bildpyramiden werden verwendet, um Bilder in verschiedenen Maßstäben zu verarbeiten.

In diesem Kapitel führen wir einige Down- und Up-Samples für Bilder durch.

Wir gebrauchen OpenCV Funktionen pyrUp und pyrDown. Sie finden Sie unterImgprocPaket. Die Syntax ist unten angegeben -

Imgproc.pyrUp(source, destination, destinationSize);
Imgproc.pyrDown(source, destination,destinationSize);

Die Parameter werden unten beschrieben -

Sr.Nr. Parameter & Beschreibung
1

source

Es ist das Quellbild.

2

destination

Es ist das Zielbild.

3

destinationSize

Dies ist die Größe des Ausgabebildes. Standardmäßig wird es als Größe ((src.cols * 2), (src.rows * 2)) berechnet.

Neben den Methoden pyrUp und pyrDown gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Durchführen von Up- und Down-Sampling für ein Bild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class main {
   public static void main( String[] args ) {
   
      try{
      
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",
         Highgui.CV_LOAD_IMAGE_COLOR);
         
         Mat destination1 = new Mat(source.rows()*2, source.cols()*2,source.type());
         destination1 = source;
         
         Imgproc.pyrUp(source, destination1, new  Size(source.cols()*2   source.rows()*2));
         Highgui.imwrite("pyrUp.jpg", destination1);
         
         source = Highgui.imread("digital_image_processing.jpg", 
         Highgui.CV_LOAD_IMAGE_COLOR);
         
         Mat destination = new Mat(source.rows()/2,source.cols()/2, source.type());
         destination = source;
         Imgproc.pyrDown(source, destination, new Size(source.cols()/2,  source.rows()/2));
         Highgui.imwrite("pyrDown.jpg", destination);
         
      } catch (Exception e) { 
         System.out.println("error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Auf dem Originalbild werden pyrUp (UP Sampling) und pyrDown (Down Sampling) ausgeführt. Die Ausgabe nach dem Abtasten ist wie unten gezeigt -

PyrUP Bild

pyrDown Image

Mit dem Schwellenwert kann auf einfachste Weise eine Bildsegmentierung erreicht werden. Bildsegmentierung bedeutet, das gesamte Bild so in einen Satz von Pixeln zu unterteilen, dass die Pixel in jedem Satz einige gemeinsame Merkmale aufweisen. Die Bildsegmentierung ist sehr nützlich beim Definieren von Objekten und ihren Grenzen.

In diesem Kapitel führen wir einige grundlegende Schwellenwertoperationen für Bilder durch.

Wir gebrauchen OpenCV Funktion threshold. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

Imgproc.threshold(source, destination, thresh , maxval , type);

Die Parameter werden unten beschrieben -

Sr.Nr. Parameter & Beschreibung
1

source

Es ist ein Quellbild.

2

destination

Es ist ein Zielbild.

3

thresh

Es ist ein Schwellenwert.

4

maxval

Dies ist der Maximalwert, der mit den Schwellenwerttypen THRESH_BINARY und THRESH_BINARY_INV verwendet werden soll.

5

type

Die möglichen Typen sind THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC und THRESH_TOZERO.

Neben diesen Schwellenwertmethoden gibt es noch andere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Ausführen von Schwellenwertoperationen für ein Bild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class main {
   public static void main( String[] args ) {
   
      try{

         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());

         destination = source;
         Imgproc.threshold(source,destination,127,255,Imgproc.THRESH_TOZERO);
         Highgui.imwrite("ThreshZero.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Auf dem obigen Originalbild werden einige Schwellenwertoperationen ausgeführt, die in der Ausgabe unten gezeigt werden -

Thresh Binary

Thresh Binary Invert

Thresh Zero

Die Form des Bildes kann mit OpenCV leicht geändert werden. Das Bild kann entweder gespiegelt, skaliert oder in eine der vier Richtungen gedreht werden.

Um die Form des Bildes zu ändern, lesen wir das Bild und konvertieren es in ein Mat-Objekt. Die Syntax ist unten angegeben -

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.

Ein Bild umdrehen

OpenCV erlaubt drei Arten von Flip-Codes, die unten beschrieben werden:

Sr.Nr. Flip Code & Beschreibung
1

0

0 bedeutet, um die x-Achse zu drehen.

2

1

1 bedeutet, um die y-Achse zu drehen.

3

-1

-1 bedeutet, um beide Achsen zu drehen.

Wir übergeben den entsprechenden Flip-Code an die Methode flip() in dem CoreKlasse. Die Syntax ist unten angegeben -

Core.flip(source mat, destination mat1, flip_code);

Die Methode flip() Es werden drei Parameter verwendet - die Quellbildmatrix, die Zielbildmatrix und der Flipcode.

Neben der Flip-Methode gibt es noch andere Methoden, die von der Core-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

add(Mat src1, Mat src2, Mat dst)

Es berechnet die Summe pro Element aus zwei Arrays oder einem Array und einem Skalar.

2

bitwise_and(Mat src1, Mat src2, Mat dst)

Es berechnet die bitweise Verbindung von zwei Arrays oder einem Array und einem Skalar pro Element.

3

bitwise_not(Mat src, Mat dst)

Es invertiert jedes Bit eines Arrays.

4

circle(Mat img, Point center, int radius, Scalar color)

Es zeichnet einen Kreis.

5

sumElems(Mat src)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

subtract(Mat src1, Scalar src2, Mat dst, Mat mask)

Es berechnet die Differenz pro Element zwischen zwei Arrays oder Arrays und einem Skalar.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Core-Klasse zum Umdrehen eines Bildes.

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

import java.io.File;
import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         File input = new File("digital_image_processing.jpg");
         BufferedImage image = ImageIO.read(input);	

         byte[] data = ((DataBufferByte) image.getRaster().  getDataBuffer()).getData();
         Mat mat = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC3);
         mat.put(0, 0, data);

         Mat mat1 = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC3);
         Core.flip(mat, mat1, -1);

         byte[] data1 = new byte[mat1.rows()*mat1.cols()*(int)(mat1.elemSize())];
         mat1.get(0, 0, data1);
         BufferedImage image1 = new BufferedImage(mat1.cols(), mat1.rows(), 5);
         image1.getRaster().setDataElements(0,0,mat1.cols(),mat1.rows(),data1);

         File ouptut = new File("hsv.jpg");
         ImageIO.write(image1, "jpg", ouptut);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie das obige Beispiel ausführen, wird ein Bildname umgedreht digital_image_processing.jpg auf das entsprechende HSV-Farbraumbild und schreiben Sie es mit Namen auf die Festplatte flip.jpg.

Original Bild

Umgedrehtes Bild

In diesem Kapitel wenden wir den Gaußschen Filter auf ein Bild an, das ein Bild verwischt. Wir werden die OpenCV-Funktion GaussianBlur verwenden, um den Gaußschen Filter auf Bilder anzuwenden. Es kann unter Imgproc-Paket gefunden werden. Die Syntax ist unten angegeben -

Imgproc.GaussianBlur(source, destination,Size,SigmaX);

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Argument & Beschreibung
1

source

Es ist ein Quellbild.

2

destination

Es ist ein Zielbild.

3

Size

Es ist die Gaußsche Kernelgröße.

4

SigmaX

Es ist die Standardabweichung des Gaußschen Kernels in X-Richtung.

Neben der GaussianBlur-Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Gaußschen Filters auf ein Bild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;


public class Main {
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("digital_image_processing.jpg",
         Highgui.CV_LOAD_IMAGE_COLOR);
         
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         Imgproc.GaussianBlur(source, destination,new Size(45,45), 0);
         Highgui.imwrite("Gaussian45.jpg", destination);
      
      } catch (Exception e) {
         System.out.println("Error:" + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Wenn dieses Originalbild mit dem Gaußschen Filter der Größen 11 und 45 gefaltet wird, wird die folgende Ausgabe angezeigt.

Gaußscher Filter der Größe 11

Gaußscher Filter der Größe 45

Wir wenden den Box-Filter an, der ein Bild verwischt. Ein Box-Filter kann die Abmessungen 3x3, 5x5, 9x9 usw. haben.

Wir gebrauchen OpenCV Funktion filter2DBox-Filter auf Bilder anwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Argument & Beschreibung
1

src

Es ist ein Quellbild.

2

dst

Es ist ein Zielbild.

3

depth

Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht.

4

kernel

Es ist der Kernel, der durch das Bild gescannt werden soll.

5

anchor

Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an.

6

delta

Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0.

7

BORDER_DEFAULT

Wir lassen diesen Wert standardmäßig.

Neben der filter2D () -Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Box-Filters auf ein Graustufenbild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         Mat kernel = Mat.ones(kernelSize,kernelSize, CvType.CV_32F);	      
         
         for(int i=0; i<kernel.rows(); i++) {
            for(int j=0; j<kernel.cols(); j++) {
            
               double[] m = kernel.get(i, j);
               
               for(int k =0; k<m.length; k++) {
                  m[k] = m[k]/(kernelSize * kernelSize);
               }
               kernel.put(i,j, m);
            }
         }	   
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

In diesem Beispiel falten wir unser Bild mit dem folgenden Filter (Kernel). Dieser Filter führt dazu, dass ein Bild mit zunehmender Größe unscharf wird.

Dieses Originalbild wurde mit dem unten angegebenen Boxfilter der Größe 5 gefaltet -

Kastenfilter der Größe 5

1/25 1/25 1/25 1/25 1/25
1/25 1/25 1/25 1/25 1/25
1/25 1/25 1/25 1/25 1/25
1/25 1/25 1/25 1/25 1/25
1/25 1/25 1/25 1/25 1/25

Faltbild (mit Boxfilter der Größe 5)

Faltbild (mit Boxfilter der Größe 9)

In diesem Kapitel lernen wir, zwei sehr gebräuchliche Morphologieoperatoren anzuwenden: Dilatation und Erosion.

Wir gebrauchen OpenCV Funktion erode und dilate. Sie finden Sie unterImgprocPaket. Die Syntax ist unten angegeben -

Imgproc.erode(source, destination, element);
Imgproc.dilate(source, destination, element);

Die Parameter werden unten beschrieben -

Sr.Nr. Parameter & Beschreibung
1

source

Es ist Quellbild.

2

destination

Es ist ein Zielbild.

3

element

Es ist ein Strukturierungselement, das für Erosion und Dilatation verwendet wird. Wenn element = Mat (), wird ein 3 x 3 rechteckiges Strukturierungselement verwendet.

Neben den Methoden erode () und dilate () gibt es noch andere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zur Durchführung von Erosion und Erweiterung eines Bildes.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class main {
   public static void main( String[] args ) {
   
      try{	
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         destination = source;

         int erosion_size = 5;
         int dilation_size = 5;
         
         Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new  Size(2*erosion_size + 1, 2*erosion_size+1));
         Imgproc.erode(source, destination, element);
         Highgui.imwrite("erosion.jpg", destination);

         source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         
         destination = source;
         
         Mat element1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new  Size(2*dilation_size + 1, 2*dilation_size+1));
         Imgproc.dilate(source, destination, element1);
         Highgui.imwrite("dilation.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("error:" + e.getMessage());
      } 
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Auf dem obigen Originalbild wurden einige Erosions- und Dilatationsvorgänge durchgeführt, die in der folgenden Ausgabe gezeigt wurden -

Erosion

Erweiterung

In diesem Kapitel lernen wir zwei Möglichkeiten, Wasserzeichen auf Bilder anzuwenden. Diese Wege sind -

  • Anwenden von Textwasserzeichen
  • Anwenden des Bildwasserzeichens

Anwenden von Textwasserzeichen

Wir gebrauchen OpenCV Funktion putTextTextwasserzeichen auf Bild anwenden. Es kann unter gefunden werdenCorePaket. Die Syntax ist unten angegeben -

Core.putText(source, Text, Point, fontFace ,fontScale , color);

Die Parameter dieser Funktion werden nachfolgend beschrieben -

Sr.Nr. Parameter & Beschreibung
1

Source

Es ist ein Quellbild.

2

Text

Dies ist der Zeichenfolgentext, der auf dem Bild angezeigt wird.

3

Point

Dies ist der Punkt, an dem Text auf dem Bild erscheinen soll.

4

fontFace

Schriftart. Zum Beispiel - FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX usw.

5

fontScale

Der Skalierungsfaktor der Schriftart wird mit der schriftartenspezifischen Basisgröße multipliziert.

6

color

Es ist Textfarbe.

Neben der putText-Methode gibt es weitere Methoden, die von der Core-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

normalize(Mat src, Mat dst, double alpha, double beta, int norm_type)

Es normalisiert die Norm oder den Wertebereich eines Arrays.

2

perspectiveTransform(Mat src, Mat dst, Mat m)

Es führt die perspektivische Matrixtransformation von Vektoren durch.

3

phase(Mat x, Mat y, Mat angle)

Es berechnet den Drehwinkel von 2D-Vektoren.

4

rectangle(Mat img, Point pt1, Point pt2, Scalar color)

Es zeichnet ein einfaches, dickes oder ausgefülltes rechtes Rechteck.

5

reduce(Mat src, Mat dst, int dim, int rtype, int dtype)

Es reduziert eine Matrix auf einen Vektor.

6

transform(Mat src, Mat dst, Mat m)

Es führt die Matrixtransformation jedes Array-Elements durch.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Core-Klasse zum Anwenden von Textwasserzeichen auf ein Bild.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(), source.type());  
         
         Core.putText(source, "Tutorialspoint.com", new Point  (source.rows()/2,source.cols()/2), Core.FONT_ITALIC,new Double(1),new  Scalar(255));

         Highgui.imwrite("watermarked.jpg", source);
         
      } catch (Exception e) {
         System.out.println("Error: "+e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Text Wasserzeichen Bild

Anwenden eines Bildwasserzeichens auf ein Bild

Wir werden verwenden OpenCV Funktion addWeightedum ein Bildwasserzeichen auf das Bild anzuwenden. Es kann unter gefunden werdenCorePaket. Die Syntax ist unten angegeben -

Core.addWeighted(InputArray src1, alpha, src2 (Watermark image), beta, gamma, OutputArray dst);

Die Parameter dieser Funktion werden nachfolgend beschrieben -

Sr.Nr. Parameter & Beschreibung
1

src1

Es ist das erste Eingabearray.

2

alpha

Dies ist das Gewicht der ersten Array-Elemente.

3

src2

Es ist das zweite Eingangsarray mit der gleichen Größe und Kanalnummer wie src1.

4

beta

Dies ist das Gewicht der zweiten Array-Elemente.

5

gamma

Es ist der Skalar, der zu jeder Summe addiert wird.

6

dst

Es ist das Ausgabearray, das dieselbe Größe und Anzahl von Kanälen wie die Eingabearrays hat.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Core-Klasse zum Anwenden eines Bildwasserzeichens auf ein Bild.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat waterMark = Highgui.imread("watermark.png",  Highgui.CV_LOAD_IMAGE_COLOR);
         Rect ROI = new Rect(waterMark.rows() * 4,waterMark.cols(),  waterMark.cols(),waterMark.rows());
         
         Core.addWeighted(source.submat(ROI), 0.8, waterMark, 0.2, 1,  source.submat(ROI));
         Highgui.imwrite("watermarkedImage.jpg", source);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Das Wasserzeichenbild

Bild mit Wasserzeichen

Die Faltung ist eine mathematische Operation für zwei Funktionen f und g. Die Funktionen f und g sind in diesem Fall Bilder, da ein Bild auch eine zweidimensionale Funktion ist.

Faltung durchführen

Um eine Faltung an einem Bild durchzuführen, werden die folgenden Schritte ausgeführt:

  • Drehen Sie die Maske (horizontal und vertikal) nur einmal.
  • Schieben Sie die Maske auf das Bild.
  • Multiplizieren Sie die entsprechenden Elemente und fügen Sie sie hinzu.
  • Wiederholen Sie diesen Vorgang, bis alle Werte des Bildes berechnet wurden.

Wir gebrauchen OpenCV Funktion filter2DFaltung auf Bilder anwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Argument & Beschreibung
1

src

Es ist ein Quellbild.

2

dst

Es ist ein Zielbild.

3

depth

Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht.

4

kernel

Es ist der Kernel, der durch das Bild gescannt werden soll.

5

anchor

Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an.

6

delta

Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0.

7

BORDER_DEFAULT

Wir lassen diesen Wert standardmäßig.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Durchführen einer Faltung für ein Graustufenbild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 3;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,0);
               put(0,1,0);
               put(0,2,0);

               put(1,0,0);
               put(1,1,1);
               put(1,2,0);

               put(2,0,0);
               put(2,1,0);
               put(2,2,0);
            }
         };
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("original.jpg", destination);
         
      } catch (Exception e) {
          System.out.println("Error:" + e.getMessage());
      }
   }
}

Ausgabe

In diesem Beispiel falten wir unser Bild mit dem folgenden Filter (Kernel). Dieser Filter führt dazu, dass das Originalbild so wie es ist erzeugt wird -

0 0 0
0 1 0
0 0 0

Original Bild

Gefaltetes Bild

Der Prewitt-Operator wird zur Kantenerkennung in einem Bild verwendet. Es werden zwei Arten von Kanten erkannt: vertikale und horizontale Kanten.

Wir gebrauchen OpenCV Funktion filter2Dum den Prewitt-Operator auf Bilder anzuwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Argument & Beschreibung
1

src

Es ist ein Quellbild.

2

dst

Es ist ein Zielbild.

3

depth

Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht.

4

kernel

Es ist der Kernel, der durch das Bild gescannt werden soll.

5

anchor

Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an.

6

delta

Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0.

7

BORDER_DEFAULT

Wir lassen diesen Wert standardmäßig.

Neben der filter2D-Methode gibt es noch andere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Prewitt-Operators auf ein Graustufenbild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,-1);
               put(0,1,0);
               put(0,2,1);

               put(1,0-1);
               put(1,1,0);
               put(1,2,1);

               put(2,0,-1);
               put(2,1,0);
               put(2,2,1);
            }
         };	 
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Dieses Originalbild wird mit dem Prewitt-Operator für vertikale Kanten wie unten angegeben gefaltet -

Vertikale Richtung

-1 0 1
-1 0 1
-1 0 1

Faltbild (vertikale Richtung)

Dieses Originalbild wurde auch mit dem Prewitt-Operator für horizontale Kanten gefaltet, der unten angegeben ist -

Horizontale Richtung

-1 -1 -1
0 0 0
1 1 1

Gefaltetes Bild (horizontale Richtung)

Der Sobel-Operator ist dem Prewitt-Operator sehr ähnlich. Es ist auch eine abgeleitete Maske und wird zur Kantenerkennung verwendet. Der Sobel-Operator wird verwendet, um zwei Arten von Kanten in einem Bild zu erkennen: Kanten in vertikaler Richtung und Kanten in horizontaler Richtung.

Wir werden verwenden OpenCV Funktion filter2DSobel-Operator auf Bilder anwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Streit
1

src

Es ist ein Quellbild.

2

dst

Es ist ein Zielbild.

3

depth

Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht.

4

kernel

Es ist der Kernel, der durch das Bild gescannt werden soll.

5

anchor

Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an.

6

delta

Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0.

7

BORDER_DEFAULT

Wir lassen diesen Wert standardmäßig.

Neben der filter2D-Methode gibt es noch andere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Sobel-Operators auf ein Graustufenbild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,-1);
               put(0,1,0);
               put(0,2,1);

               put(1,0-2);
               put(1,1,0);
               put(1,2,2);

               put(2,0,-1);
               put(2,1,0);
               put(2,2,1);
            }
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Dieses Originalbild wird mit dem Sobel-Operator für vertikale Kanten gefaltet, der unten angegeben ist -

Vertikale Richtung

-1 0 1
-2 0 2
-1 0 1

Faltbild (vertikale Richtung)

Dieses Original wird mit dem Sobel-Operator für horizontale Kanten gefaltet, der unten angegeben ist -

Horizontale Richtung

-1 -2 -1
0 0 0
1 2 1

Gefaltetes Bild (horizontale Richtung)

Kirsch-Kompassmasken sind eine weitere Art von Ableitungsmasken, die zur Kantenerkennung verwendet werden. Dieser Operator wird auch als Richtungsmaske bezeichnet. In diesem Operator nehmen wir eine Maske und drehen sie in alle acht Kompassrichtungen, um Kanten der acht Richtungen zu erhalten.

Wir werden verwenden OpenCV Funktion filter2DKirsch-Operator auf Bilder anwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Streit
1

src

Es ist ein Quellbild.

2

dst

Es ist ein Zielbild.

3

depth

Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht.

4

kernel

Es ist der Kernel, der durch das Bild gescannt werden soll.

5

anchor

Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an.

6

delta

Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0.

7

BORDER_DEFAULT

Wir lassen diesen Wert standardmäßig.

Neben der filter2D () -Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Kirsch-Operators auf ein Graustufenbild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,-3);
               put(0,1,-3);
               put(0,2,-3);
      
               put(1,0-3);
               put(1,1,0);
               put(1,2,-3);

               put(2,0,5);
               put(2,1,5);
               put(2,2,5);
            }
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Dieses Originalbild wird mit dem Kirsch-Operator der Ostkanten gefaltet, der wie unten angegeben -

Kirsch Ost

-3 -3 -3
-3 0 -3
5 5 5

Faltbild (Kirsch Ost)

Dieses Originalbild ist mit dem Kirsch-Operator der Südwestkanten gefaltet, der wie unten angegeben -

Kirsch Südwesten

5 5 -3
5 0 -3
-3 -3 -3

Faltbild (Kirsch Südwesten)

Robinson-Kompassmasken sind eine weitere Art von abgeleiteten Masken, die zur Kantenerkennung verwendet werden. Dieser Operator wird auch als Richtungsmaske bezeichnet. In diesem Operator nehmen wir eine Maske und drehen sie in alle acht Hauptrichtungen, um Kanten der acht Richtungen zu erhalten.

Wir werden verwenden OpenCV Funktion filter2Dum den Robinson-Operator auf Bilder anzuwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Argument & Beschreibung
1

src

Es ist ein Quellbild.

2

dst

Es ist ein Zielbild.

3

depth

Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht.

4

kernel

Es ist der Kernel, der durch das Bild gescannt werden soll.

5

anchor

Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an.

6

delta

Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0.

7

BORDER_DEFAULT

Wir lassen diesen Wert standardmäßig.

Neben der filter2D-Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Robinson-Operators auf ein Graustufenbild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,-1);
               put(0,1,0);
               put(0,2,1);

               put(1,0-2);
               put(1,1,0);
               put(1,2,2);

               put(2,0,-1);
               put(2,1,0);
               put(2,2,1);
            }
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Dieses Originalbild wird mit dem Robinson-Operator der Nordkanten wie unten angegeben gefaltet -

Nordrichtungsmaske

-1 0 1
-2 0 2
-1 0 1

Gefaltetes Bild (Robinson North)

Dieses Originalbild wurde auch mit dem Robinson-Operator von East Rands wie unten angegeben gefaltet -

Ostrichtungsmaske

-1 -2 -1
0 0 0
1 2 1

Gefaltetes Bild (Robinson East)

Der Laplace-Operator ist auch ein Ableitungsoperator, mit dem Kanten in einem Bild gefunden werden. Der Hauptunterschied zwischen Laplace und anderen Operatoren wie Prewitt, Sobel, Robinson und Kirsch besteht darin, dass dies alles abgeleitete Masken erster Ordnung sind, Laplace jedoch eine abgeleitete Maske zweiter Ordnung.

Wir gebrauchen OpenCV Funktion filter2DLaplace-Operator auf Bilder anwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Argumente
1

src

Es ist ein Quellbild.

2

dst

Es ist ein Zielbild.

3

depth

Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht.

4

kernel

Es ist der Kernel, der durch das Bild gescannt werden soll.

5

anchor

Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an.

6

delta

Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0.

7

BORDER_DEFAULT

Wir lassen diesen Wert standardmäßig.

Neben der filter2D () -Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Laplace-Operators auf ein Graustufenbild.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());

         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,0);
               put(0,1,-1)
               put(0,2,0);

               put(1,0-1);
               put(1,1,4);
               put(1,2,-1);

               put(2,0,0);
               put(2,1,-1);
               put(2,2,0);
            }
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Dieses Originalbild wird mit dem unten angegebenen Laplace-Negativ-Operator gefaltet -

Laplace-Negativ

0 -1 0
-1 4 -1
0 -1 0

Gefaltetes Bild (Laplace-Negativ)

Dieses Originalbild wird mit dem Laplace-Positiv-Operator wie unten angegeben gefaltet -

Laplace-positiv

0 1 0
1 -4 1
0 1 0

Gefaltetes Bild (Laplace-positiv)

Im Filter für gewichtete Durchschnittswerte haben wir dem Mittelwert mehr Gewicht gegeben, wodurch der Beitrag des Zentrums größer wird als der Rest der Werte. Aufgrund der gewichteten Durchschnittsfilterung können wir die Unschärfe des Bildes steuern.

Wir gebrauchen OpenCV Funktion filter2Dum gewichteten Durchschnittsfilter auf Bilder anzuwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Die Funktionsargumente werden unten beschrieben -

Sr.Nr. Argument & Beschreibung
1

src

Es ist ein Quellbild.

2

dst

Es ist ein Zielbild.

3

ddepth

Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht.

4

kernel

Es ist der Kernel, der durch das Bild gescannt werden soll.

5

anchor

Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an.

6

delta

Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0.

7

BORDER_DEFAULT

Wir lassen diesen Wert standardmäßig.

Neben der filter2D () -Methode gibt es andere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden eines gewichteten Durchschnittsfilters auf ein Bild von Graycale.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 9;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = Mat.ones(kernelSize,kernelSize, CvType.CV_32F) {	      
         
         for(int i=0; i<kernel.rows(); i++) {
            for(int j=0; j<kernel.cols(); j++) {

               double[] m = kernel.get(i, j);

               for(int k =0; k<m.length; k++) {

                  if(i==1 && j==1) {
                     m[k] = 10/18;
                  }
                  else{
                     m[k] = m[k]/(18);
                  }
               }
               kernel.put(i,j, m);

               }
            }	
         };	      
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Dieses Originalbild wird mit dem unten angegebenen gewichteten Durchschnittsfilter gefaltet -

Gewichteter Durchschnittsfilter

1 1 1
1 10 1
1 1 1

Gefaltetes Bild

Beim Zoomen wird ein Bild vergrößert, damit die Details im Bild sichtbarer und markanter werden.

Wir gebrauchen OpenCV Funktion resizeum das Zoomen auf Bilder anzuwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -

Imgproc.resize(source,destination, destination.size(),zoomFactor,zoomFactor,Interpolation);

In der Größenänderungsfunktion übergeben wir das Quellbild, das Zielbild und seine Größe, den Zoomfaktor und die zu verwendende Interpolationsmethode.

Die verfügbaren Interpolationsmethoden werden nachfolgend beschrieben -

Sr.Nr. Interpolationsmethode & Beschreibung
1

INTER_NEAREST

Es ist die Interpolation zum nächsten Nachbarn.

2

INTER_LINEAR

Es handelt sich um eine bilineare Interpolation (standardmäßig verwendet).

3

INTER_AREA

Es wird unter Verwendung der Pixelflächenbeziehung neu abgetastet. Es kann ein bevorzugtes Verfahren zur Bilddezimierung sein, da es freiere Ergebnisse liefert.

4

INTER_CUBIC

Es ist eine bikubische Interpolation über eine 4x4-Pixel-Nachbarschaft.

5

INTER_LANCZOS4

Es ist eine Lanczos-Interpolation über eine Nachbarschaft von 8 x 8 Pixeln.

Neben der Größenänderungsmethode gibt es noch andere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Zooms auf ein Bild.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try {
         int zoomingFactor = 2;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("image.jpg", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows() * zoomingFactor, source.cols()*  zoomingFactor,source.type());  
         
         Imgproc.resize(source, destination, destination.size(),  zoomingFactor,zoomingFactor,Imgproc.INTER_NEAREST);
         Highgui.imwrite("zoomed.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: "+e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:

Original Bild

Vergrößertes Bild (Zoomfaktor - 2)

In diesem Kapitel werden einige der häufig verwendeten kostenlosen Bildverarbeitungsbibliotheken vorgestellt, die problemlos in das Projekt integriert werden können. Diese Bibliotheken umfassen -

  • ImageJ
  • Fiji
  • Commons Imaging
  • ImageMagick
  • Endrov
  • LeadTools
  • OpenCv

ImageJ

ImageJ ist ein gemeinfreies Java-Bildverarbeitungsprogramm, das von NIH Image für den Macintosh inspiriert wurde. Es kann 8-Bit-, 16-Bit- und 32-Bit-Bilder anzeigen, bearbeiten, analysieren, verarbeiten, speichern und drucken.

Einige der Grundfunktionen von ImageJ werden nachfolgend beschrieben -

Sr.Nr. Funktion & Beschreibung
1

Runs Everywhere

ImageJ ist in Java geschrieben, sodass es unter Linux, Mac OS X und Windows sowohl im 32-Bit- als auch im 64-Bit-Modus ausgeführt werden kann.

2

Open Source

ImageJ und sein Java-Quellcode sind frei verfügbar und gemeinfrei.

3

Toolkit

Verwenden Sie ImageJ als Bildverarbeitungs-Toolkit (Klassenbibliothek), um Applets, Servlets oder Anwendungen zu entwickeln.

4

Data Types

8-Bit-Graustufen- oder indizierte Farbe, 16-Bit-Ganzzahl ohne Vorzeichen, 32-Bit-Gleitkomma und RGB-Farbe.

5

File Formats

Öffnen und speichern Sie GIF, JPEG, BMP, PNG, PGM, FITS und ASCII. Öffnen Sie DICOM. Öffnen Sie TIFFs, GIFs, JPEGs, DICOMs und Rohdaten mithilfe einer URL.

6

Selections

Erstellen Sie rechteckige, elliptische oder unregelmäßige Bereichsauswahlen. Erstellen Sie eine Linien- und Punktauswahl.

7

Image Enhancement

Unterstützt Glätten, Schärfen, Kantenerkennung, Medianfilterung und Schwellenwertbildung für 8-Bit-Graustufen- und RGB-Farbbilder.

8

Color Processing

Teilen Sie ein 32-Bit-Farbbild in RGB- oder HSV-Komponenten auf. Fügen Sie 8-Bit-Komponenten zu einem Farbbild zusammen.

Fidschi

Fidschi ist ein Bildverarbeitungspaket. Es kann als eine Distribution von ImageJ (und ImageJ2) zusammen mit Java, Java3D und vielen Plug-Ins beschrieben werden, die in einer kohärenten Menüstruktur organisiert sind. Fidschi vergleicht sich mit ImageJ wie Ubuntu mit Linux.

Abgesehen von den Grundfunktionen von ImageJ werden im Folgenden einige der erweiterten Funktionen von Fidschi beschrieben -

Sr.Nr. Funktion & Beschreibung
1

Registering 3D images

Dies beinhaltet elastische Ausrichtung und Montage, Merkmalsextraktion, Bildstabilisator usw.

2

Segmenting images

Es bietet mehr als 35 Arten der Segmentierung.

3

Useful keyboard short cuts

Fuji hat viele Tastaturkürzel.

4

Scripting

Ermöglichen Sie Skripte mit Makros in JavaScript, JRuby, Jython, Clojure und Beanshell.

5

Developing Plug-ins

Verwenden Sie den Skript-Editor, um mit der Entwicklung von Plug-Ins zu beginnen, und führen Sie dann die Plug-Ins aus.

6

ImageJ Tricks

ImageJ ist einfach zu bedienen, aber manchmal möchten Sie eine Funktion, die tatsächlich implementiert ist, aber Sie wissen nicht, wie Sie sie auslösen sollen.

Commons Imaging

Apache Commons Imaging, früher bekannt als Apache Commons Sanselan, ist eine Bibliothek, die eine Vielzahl von Bildformaten liest und schreibt, einschließlich des schnellen Parsens von Bildinformationen wie (Größe, Farbe, Raum, ICC-Profil usw.) und der Metadaten.

Einige der Grundfunktionen von ImageJ werden nachfolgend beschrieben -

Sr.Nr. Funktion & Beschreibung
1

Java

Apache Commons Imaging ist in 100% reinem Java geschrieben. Es kann auf jeder JVM und jeder Plattform ohne Änderungen ausgeführt werden.

2

Image Formats

Es liest und schreibt eine Vielzahl von Bildformaten und unterstützt einige Variationen und Codierungen, die von allen oder den meisten anderen Bibliotheken übersehen werden.

3

Metadata support

Es unterstützt das strukturierte Lesen und Schreiben einer Vielzahl von Metadaten, einschließlich EXIF-Metadaten.

4

Network Friendly

Es ist netzwerkfreundlich. Commons Imaging liest nur die benötigten Daten und speichert die gelesenen Daten zwischen, damit sie nicht zu stark im Netzwerk sind.

5

Easy to use

Es ist sehr einfach zu bedienen. Es hat eine einfache, saubere Oberfläche. Bei den meisten Vorgängen handelt es sich um einzelne Imaging-Methodenaufrufe.

6

Transparent

Commons Imaging soll transparent sein. Es gibt keine versteckten Puffer zum Entsorgen, keinen nativen Speicher zum Freigeben, keine Hintergrundthreads.

7

Open Source

Es ist Freie Software / Open Source. Es ist unter der Apache Software License verfügbar.

8

Color Conversions

Die ColorConversions-Klasse bietet Methoden zum Konvertieren zwischen den folgenden Farbräumen: CIE-L * CH, CIE-L * ab, CIE-L * uv, CMY, CMYK, HSL, HSV, Hunter-Lab, RGB, XYZ und YXY.

ImageMagick

ImageMagick ist eine Software-Suite zum Erstellen, Bearbeiten, Erstellen oder Konvertieren von Bitmap-Bildern. Es kann Bilder in mehr als 100 Formaten lesen und schreiben, einschließlich DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PNG, Postscript, SVG und TIFF. Verwenden Sie ImageMagick, um die Größe zu ändern, zu spiegeln, zu spiegeln, zu drehen, zu verzerren, zu scheren und zu transformieren, Bildfarben anzupassen, verschiedene Spezialeffekte anzuwenden oder Text, Linien, Polygone, Ellipsen und Bezier-Kurven zu zeichnen.

Einige der Grundfunktionen von ImageMagick werden im Folgenden beschrieben:

Sr.Nr. Funktion & Beschreibung
1

Format conversion

Es konvertiert ein Bild von einem Format in ein anderes (z. B. PNG in JPEG).

2

Transform

Es kann die Größe eines Bildes ändern, es drehen, zuschneiden, spiegeln oder zuschneiden.

3

Transparency

Es macht Teile eines Bildes unsichtbar.

4

Draw

Es fügt einem Bild Formen oder Text hinzu.

5

Decorate

Es fügt einem Bild einen Rahmen oder Rahmen hinzu.

6

Special effects

Es kann ein Bild verwischen, schärfen, schwellen oder tönen.

7

Animation

Es kann eine GIF-Animationssequenz aus einer Gruppe von Bildern erstellen.

8

Composite

Es kann ein Bild über ein anderes überlappen.

9

Morphology of shapes

Es extrahiert Merkmale, beschreibt Formen und erkennt Muster in Bildern.

10

Encipher or decipher an image

Es wandelt gewöhnliche Bilder in unverständlichen Kauderwelsch um und wieder zurück.

Endrov

Endrov ist ein Mehrzweck-Bildanalyseprogramm. Es ist unabhängig geschrieben und wurde entwickelt, um viele der Mängel anderer freier Software und vieler kommerzieller Pakete zu beheben.

Einige der Grundfunktionen von Endrov werden im Folgenden beschrieben -

Sr.Nr. Funktion & Beschreibung
1

View data

Es zeigt Daten in 2D und 3D an. Entwickelt für komplexe 4D-Datenschemata und eine unbegrenzte Anzahl von Kanälen, wobei jeder Kanal seine eigene X-, Y- und Z-Auflösung haben kann.

2

Annotate your images

Es kommentiert Ihre Bilder automatisch oder von Hand, um sie zu verstehen und Statistiken zu erhalten.

3

Undo and Redo

Es kann für alle Vorgänge rückgängig gemacht und wiederholt werden.

4

Lazy Evaluation

Es wurde vom Boden aus für große Bildsets entwickelt. Endrov verwendet Lazy Evaluation, ein Konzept, das hauptsächlich in Forschungsprogrammiersprachen verfügbar ist.

5

Scripting language

Es unterstützt die grafische Skriptsprache sowie die traditionelle Skriptsprache.

6

Java

Geschrieben in Java. Die Plug-In-Architektur ermöglicht eine einfache Erweiterung mit neuen Java-Plug-Ins. Es kann mit Matlab interagieren.

7

Formats

Es greift mit Bio-Formaten auf fast alle kommerziellen und offenen Dateiformate zu.

8

Microscopic Processing

Es kann alle Ihre Mikroskope mit einem Programm steuern und eine schnelle Bildanalyse durchführen.

LEADTOOLS

LEADTOOLS bietet über 200 Bildverarbeitungsfunktionen in verschiedenen Kategorien, darunter Dokumentenbereinigung, medizinische Bildverbesserung, Farbkonvertierung und -korrektur, Rauschunterdrückung, Kantenerkennung und mehr.

Einige der Grundfunktionen von LEADTOOLS werden im Folgenden beschrieben -

Sr.Nr. Funktion & Beschreibung
1

Scanned Document Image Processing

Diese leistungsstarke Sammlung von Funktionen kann gescannte Dokumente von Artefakten und Unvollkommenheiten wie Lochungen, Schrägwinkeln, Rändern, Staubflecken und mehr lesen.

2

Medical Image Processing

Verbessern Sie das Bild oder markieren Sie die Details, indem Sie den Hintergrund verschieben, auswählen, subtrahieren und entfernen, um eine bessere Darstellung zu erzielen.

3

Geometric Transformation

Mit diesen Funktionen können Sie Bilder bereinigen, ausrichten, korrigieren oder künstlerische 3D-Effekte anwenden.

4

Brightness and Contrast

Diese Funktionen können verwendet werden, um Bilder zu verbessern, künstlerische Effekte anzuwenden oder die diagnostische Bewertung medizinischer Bilder zu unterstützen.

5

Color Space Conversion

Sie können Einzel- und Multithread-Anwendungen, einschließlich von IIS und Windows WF gehosteter Anwendungen, Bildfarbraumfunktionen hinzufügen.

6

Color Correction

Diese Funktionen werden verwendet, um Bilder mit vertauschten Farbkanälen zu korrigieren, Farbintensitäten auszugleichen oder verschiedene Bildanalyseaufgaben auszuführen.

7

Image Enhancement

Diese Funktionen werden verwendet, um häufige Fehler in der Fotografie wie rote Augen und unausgeglichene Farben zu korrigieren und die diagnostische Bewertung medizinischer Bilder zu unterstützen.

8

Region of Interest

Diese Funktionen werden verwendet, um interessierende Bereiche in Bildern zu erstellen und zu ändern, um Bildverarbeitungsfunktionen für bestimmte Teile eines Bildes auszuführen, Zeit im Strichcode und in der OCR-Erkennung zu sparen oder verschiedene Bildanalyseaufgaben auszuführen.

OpenCV

OpenCV wird unter einer BSD-Lizenz veröffentlicht und ist daher sowohl für den akademischen als auch für den kommerziellen Gebrauch kostenlos. Es verfügt über C ++ -, C-, Python- und Java-Schnittstellen und unterstützt Windows, Linux, Mac OS, iOS und Android. OpenCV wurde für Recheneffizienz und mit einem starken Fokus auf Echtzeitanwendungen entwickelt. Die in optimiertem C / C ++ geschriebene Bibliothek kann die Multi-Core-Verarbeitung nutzen.

Einige grundlegende Funktionen von OpenCV werden kurz beschrieben -

Sr.Nr. Funktion & Beschreibung
1

Smoothing Images

Dies beinhaltet das Anwenden von Blur, GaussianBlur, MedianBlur und bilateralem Filter.

2

Eroding and Dilating

Es können zwei sehr gebräuchliche Morphologieoperatoren angewendet werden - Dilatation und Erosion.

3

Morphology Transformations

OpenCV-Funktion morphologyEx zum Anwenden morphologischer Transformationen wie Öffnen, Schließen, TopHat und BlackHat usw.

4

Image Pyramids

OpenCV funktioniert mit pyrUp und pyrDown, um ein bestimmtes Bild abwärts oder aufwärts abzutasten.

4

Basic Thresholding Operations

Führen Sie grundlegende Schwellenwertoperationen mit dem OpenCV-Funktionsschwellenwert aus.

5

Adding borders to your images

Mit der OpenCV-Funktion copyMakeBorder werden die Ränder festgelegt (zusätzliche Auffüllung Ihres Bildes).

7

Remapping

In OpenCV bietet die Funktions-Remap eine einfache Remapping-Implementierung.

8

Histogram Calculation

Für einfache Zwecke implementiert OpenCV die Funktion calcHist, die das Histogramm einer Reihe von Arrays (normalerweise Bilder oder Bildebenen) berechnet. Es kann mit bis zu 32 Dimensionen betrieben werden.

OpenCV wird unter einer BSD-Lizenz veröffentlicht und ist daher sowohl für den akademischen als auch für den kommerziellen Gebrauch kostenlos. Es verfügt über C ++ -, C-, Python- und Java-Schnittstellen und unterstützt Windows, Linux, Mac OS, iOS und Android.

OpenCV wurde für Recheneffizienz und mit einem starken Fokus auf Echtzeitanwendungen entwickelt. Die in optimiertem C / C ++ geschriebene Bibliothek kann die Multi-Core-Verarbeitung nutzen.

Einige der Grundfunktionen von OpenCV werden im Folgenden beschrieben -

Sr.Nr. Funktion & Beschreibung
1

Smoothing Images

Dies beinhaltet das Anwenden von Blur, GaussianBlur, MedianBlur und bilateralem Filter.

2

Eroding and Dilating

Es können zwei sehr gebräuchliche Morphologieoperatoren angewendet werden - Dilatation und Erosion.

3

Morphology Transformations

OpenCV-Funktion morphologyEx zum Anwenden morphologischer Transformationen wie Öffnen, Schließen, TopHat und BlackHat usw.

4

Image Pyramids

OpenCV funktioniert mit pyrUp und pyrDown, um ein bestimmtes Bild abwärts oder aufwärts abzutasten.

4

Basic Thresholding Operations

Es kann grundlegende Schwellenwertoperationen unter Verwendung des OpenCV-Funktionsschwellenwerts ausführen.

5

Adding borders to your images

Mit der OpenCV-Funktion copyMakeBorder werden die Ränder festgelegt (zusätzliche Auffüllung Ihres Bildes).

7

Remapping

In OpenCV bietet die Funktions-Remap eine einfache Remapping-Implementierung.

8

Histogram Calculation

Für einfache Zwecke implementiert OpenCV die Funktion calcHist, die das Histogramm einer Reihe von Arrays (normalerweise Bilder oder Bildebenen) berechnet. Es kann mit bis zu 32 Dimensionen betrieben werden.

OpenCV integrieren

In den folgenden Schritten wird erläutert, wie Sie OpenCV in Ihre Anwendungen integrieren.

Laden Sie OpenCV herunter

Sie können OpenCV von der offiziellen Website hier herunterladen .

Benutzerbibliothek erstellen

Außerdem erstellen wir eine Benutzerbibliothek von OpenCV, damit wir sie als zukünftiges Projekt verwenden können.

Starten Sie Eclipse

Wählen Sie im Menü Fenster -> Einstellungen.

Navigieren Sie unter Java -> Erstellungspfad -> Benutzerbibliotheken und klicken Sie auf Neu.

Geben Sie nun den Namen für Ihre Bibliothek ein. Zum Beispiel OpenCV-2.4.6.

Wählen Sie danach Ihre neue Benutzerbibliothek (dh OpenCV-2.4.6) und klicken Sie auf Externe JARs hinzufügen.

Durchsuchen Sie C: \ OpenCV-2.4.6 \ build \ java \ und wählen Sie opencv-246.jar aus. Erweitern Sie nach dem Hinzufügen der JAR-Datei die Datei opencv-246.jar, wählen Sie den Speicherort der nativen Bibliothek aus und drücken Sie Bearbeiten.

Wählen Sie Externer Ordner ... und suchen Sie den Ordner C: \ OpenCV-2.4.6 \ build \ java \ x64. Wenn Sie ein 32-Bit-System haben, müssen Sie den x86-Ordner anstelle von x64 auswählen.

Drücken Sie OK und Sie sind fertig.

Jetzt wird Ihre Benutzerbibliothek erstellt. Jetzt können Sie diese Konfiguration in jedem Projekt wiederverwenden.

Erstellen Sie ein OpenCV-Projekt

Erstellen Sie ein neues Java-Projekt in Eclipse.

Wählen Sie im Schritt Java-Einstellungen auf der Registerkarte Bibliotheken die Option Bibliothek hinzufügen ... und wählen Sie OpenCV-2.4.6 aus. Klicken Sie dann auf Fertig stellen.

Klicken Sie auf Fertig stellen und Sie sind fertig.

Um ein Farbbild mit OpenCV in ein Graustufenbild umzuwandeln, lesen wir das Bild in BufferedImage und konvertieren Sie es in MatObjekt. Die Syntax ist unten angegeben -

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.

Anschließend können Sie das Bild mithilfe der Methode vom RGB- in das Graustufenformat umwandeln cvtColor() in dem ImgprocKlasse. Die Syntax ist unten angegeben -

Imgproc.cvtColor(source mat, destination mat1, Imgproc.COLOR_RGB2GRAY);

Die Methode cvtColor() Es werden drei Parameter verwendet: die Quellbildmatrix, die Zielbildmatrix und der Farbkonvertierungstyp.

Neben der cvtColor-Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie sind unten aufgeführt -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Konvertieren eines Bildes in Graustufen -

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

import java.io.File;
import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) { 
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         File input = new File("digital_image_processing.jpg");
         BufferedImage image = ImageIO.read(input);	

         byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
         Mat mat = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
         mat.put(0, 0, data);

         Mat mat1 = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC1);
         Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2GRAY);

         byte[] data1 = new byte[mat1.rows() * mat1.cols() * (int)(mat1.elemSize())];
         mat1.get(0, 0, data1);
         BufferedImage image1 = new BufferedImage(mat1.cols(),mat1.rows(), BufferedImage.TYPE_BYTE_GRAY);
         image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1);

         File ouptut = new File("grayscale.jpg");
         ImageIO.write(image1, "jpg", ouptut);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie das angegebene Beispiel ausführen, wird ein Bildname konvertiert digital_image_processing.jpg auf das entsprechende Graustufen-Image und schreibt es mit Namen auf die Festplatte grayscale.jpg.

Original Bild

Graustufenbild

Um den Farbraum eines Bildes mit OpenCV in ein anderes zu ändern, lesen wir das Bild ein BufferedImage und konvertieren Sie es in MatObjekt. Die Syntax ist unten angegeben -

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.

OpenCv ermöglicht viele Farbkonvertierungstypen, die alle in der Imgproc-Klasse enthalten sind. Einige der Typen werden kurz beschrieben -

Sr.Nr. Farbkonvertierungstyp
1 COLOR_RGB2BGR
2 COLOR_RGB2BGRA
3 COLOR_RGB2GRAY
4 COLOR_RGB2HLS
5 COLOR_RGB2HSV
6 COLOR_RGB2Luv
7 COLOR_RGB2YUV
8 COLOR_RGB2Lab

Übergeben Sie von einem der Farbkonvertierungstypen einfach den entsprechenden in die Methode cvtColor() in dem ImgprocKlasse. Die Syntax ist unten angegeben -

Imgproc.cvtColor(source mat, destination mat1, Color_Conversion_Code);

Die Methode cvtColor() Es werden drei Parameter verwendet: die Quellbildmatrix, die Zielbildmatrix und der Farbkonvertierungstyp.

Neben der Methode cvtColor () gibt es noch andere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -

Sr.Nr. Methode & Beschreibung
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Es konvertiert ein Bild von einem Farbraum in einen anderen.

2

dilate(Mat src, Mat dst, Mat kernel)

Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements.

3

equalizeHist(Mat src, Mat dst)

Es gleicht das Histogramm eines Graustufenbildes aus.

4

filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta)

Es faltet ein Bild mit dem Kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Es verwischt ein Bild mit einem Gaußschen Filter.

6

integral(Mat src, Mat sum)

Es berechnet das Integral eines Bildes.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Konvertieren eines Bildes von einem Farbraum in einen anderen.

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

import java.io.File;
import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         File input = new File("digital_image_processing.jpg");
         BufferedImage image = ImageIO.read(input);	
         byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
         Mat mat = new Mat(image.getHeight(),image.getWidth(), CvType.CV_8UC3);
         mat.put(0, 0, data);

         Mat mat1 = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
         Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2HSV);

         byte[] data1 = new byte[mat1.rows()*mat1.cols()*(int)(mat1.elemSize())];
         mat1.get(0, 0, data1);
         BufferedImage image1 = new BufferedImage(mat1.cols(), mat1.rows(), 5);
         image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1);

         File ouptut = new File("hsv.jpg");
         ImageIO.write(image1, "jpg", ouptut);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Ausgabe

Wenn Sie das angegebene Beispiel ausführen, wird ein Bildname konvertiert digital_image_processing.jpg zu seinem äquivalenten HSV-Farbraumbild und schreibt es mit Namen auf die Festplatte hsv.jpg.

Originalbild (RGB)

Konvertiertes Bild (HSV)