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- BufferedImage
Klasse ist eine Unterklasse der Image-Klasse. Es wird verwendet, um die Bilddaten zu verarbeiten und zu bearbeiten. A BufferedImage
besteht aus ColorModel von Bilddaten. Alle BufferedImage
Objekte haben eine obere linke Eckkoordinate von (0, 0).
Konstruktoren
Diese Klasse unterstützt drei Arten von Konstruktoren.
Der erste Konstruktor erstellt ein neues BufferedImage
mit einem angegebenen ColorModel und Raster.
BufferedImage(ColorModel cm, WritableRaster raster,
boolean isRasterPremultiplied, Hashtable<?,?> properties)
Der zweite Konstruktor erstellt BufferedImage
einen der vordefinierten Bildtypen.
BufferedImage(int width, int height, int imageType)
Der dritte Konstruktor erstellt BufferedImage
einen 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 |
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 |
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 |
7 | getMinX() Es gibt die minimale x-Koordinate davon zurück |
8 | getMinY() Es gibt die minimale y-Koordinate davon 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 einer Java- BufferedImage
Klasse, 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.