Java DIP - szybki przewodnik
Cyfrowe przetwarzanie obrazu (DIP) zajmuje się obróbką obrazów cyfrowych za pomocą komputera cyfrowego. Jest to dziedzina sygnałów i systemów, ale koncentruje się szczególnie na obrazach. DIP koncentruje się na opracowaniu systemu komputerowego, który jest w stanie przetwarzać obraz. Wejściem takiego systemu jest obraz cyfrowy. System przetwarza obraz przy użyciu wydajnych algorytmów i podaje obraz jako wynik.
Java to język programowania wysokiego poziomu, który jest szeroko stosowany we współczesnym świecie. Może wydajnie obsługiwać i obsługiwać cyfrowe przetwarzanie obrazu przy użyciu różnych funkcji.
BufferedImage
Klasa Java jest podklasą klasy Image. Służy do obsługi i manipulowania danymi obrazu. A BufferedImage
składa się z ColorModel danych obrazu. Wszystkie BufferedImage
obiekty mają współrzędne w lewym górnym rogu (0, 0).
Konstruktorzy
Ta klasa obsługuje trzy typy konstruktorów.
Pierwszy konstruktor tworzy nowy BufferedImage
z określonym ColorModel i Raster.
BufferedImage(ColorModel cm, WritableRaster raster,
boolean isRasterPremultiplied, Hashtable<?,?> properties)
Drugi konstruktor tworzy BufferedImage
jeden z predefiniowanych typów obrazów.
BufferedImage(int width, int height, int imageType)
Trzeci konstruktor tworzy BufferedImage
jeden z predefiniowanych typów obrazów: TYPE_BYTE_BINARY lub TYPE_BYTE_INDEXED.
BufferedImage(int width, int height, int imageType, IndexColorModel cm)
Sr.No | Metoda i opis |
---|---|
1 | copyData(WritableRaster outRaster) Oblicza dowolny prostokątny region |
2 | getColorModel() Zwraca obiekt klasy ColorModel obrazu. |
3 | getData() Zwraca obraz jako jedną dużą płytkę. |
4 | getData(Rectangle rect) Oblicza i zwraca dowolny region |
5 | getGraphics() Ta metoda zwraca Graphics2D, zachowuje zgodność wsteczną. |
6 | getHeight() Zwraca wysokość |
7 | getMinX() Zwraca minimalną współrzędną x tego |
8 | getMinY() Zwraca minimalną współrzędną y tego |
9 | getRGB(int x, int y) Zwraca piksel będący liczbą całkowitą w domyślnym modelu kolorów RGB (TYPE_INT_ARGB) i domyślnej przestrzeni kolorów sRGB. |
10 | getType() Zwraca typ obrazu. |
Przykład
Poniższy przykład demonstruje użycie BufferedImage
klasy java, która rysuje tekst na ekranie za pomocą Graphics Object -
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);
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
W tym rozdziale zobaczymy, jak można pobrać obraz z Internetu, wykonać na nim kilka technik przetwarzania obrazu, a następnie ponownie przesłać przetworzony obraz na serwer.
Pobieranie obrazu
Aby pobrać obraz ze strony internetowej, używamy klasy java o nazwie URL, które można znaleźć pod java.netpakiet. Jego składnia jest podana poniżej -
String website = "http://tutorialspoint.com";
URL url = new URL(website);
Oprócz powyższej metody istnieją inne metody dostępne w adresie URL klasy, jak opisano w skrócie -
Sr.No. | Metoda i opis |
---|---|
1 | public String getPath() Zwraca ścieżkę adresu URL. |
2 | public String getQuery() Zwraca część adresu URL zawierającą zapytanie. |
3 | public String getAuthority() Zwraca autorytet adresu URL. |
4 | public int getPort() Zwraca port adresu URL. |
5 | public int getDefaultPort() Zwraca domyślny port protokołu adresu URL. |
6 | public String getProtocol() Zwraca protokół adresu URL. |
7 | public String getHost() Zwraca hosta adresu URL. |
Przykład
Poniższy przykład demonstruje użycie klasy URL języka Java do pobierania obrazu z Internetu -
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());
}
}
}
Wynik
Gdy wykonasz powyższe, zobaczysz następujące dane wyjściowe.
Pobrałby następujący obraz z serwera.
Przesyłanie obrazu
Zobaczmy, jak przesłać obraz na serwer WWW. Konwertujemy BufferedImage na tablicę bajtów, aby wysłać ją na serwer.
Używamy klasy Java ByteArrayOutputStream, które można znaleźć pod java.iopakiet. Jego składnia jest podana poniżej -
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
Aby przekonwertować obraz na tablicę bajtów, używamy toByteArray() metoda ByteArrayOutputStreamklasa. Jego składnia jest podana poniżej -
byte[] bytes = baos.toByteArray();
Oprócz powyższej metody istnieją inne metody dostępne w klasie ByteArrayOutputStream, jak opisano w skrócie -
Sr.No. | Metoda i opis |
---|---|
1 | public void reset() Ta metoda resetuje liczbę prawidłowych bajtów strumienia wyjściowego tablicy bajtów do zera, tak aby wszystkie skumulowane dane wyjściowe w strumieniu zostały odrzucone. |
2 | public byte[] toByteArray() Ta metoda tworzy nowo przydzieloną tablicę Byte. Jego rozmiar byłby aktualnym rozmiarem strumienia wyjściowego, a zawartość bufora zostanie do niego skopiowana. Zwraca bieżącą zawartość strumienia wyjściowego jako tablicę bajtów. |
3 | public String toString() Konwertuje zawartość buforu na ciąg. Tłumaczenie zostanie wykonane zgodnie z domyślnym kodowaniem znaków. Zwraca ciąg przetłumaczony z zawartości bufora. |
4 | public void write(int w) Zapisuje określoną tablicę w strumieniu wyjściowym. |
5 | public void write(byte []b, int of, int len) Zapisuje len liczby bajtów, zaczynając od przesunięcia do strumienia. |
6 | public void writeTo(OutputStream outSt) Zapisuje całą zawartość tego strumienia do określonego argumentu strumienia. |
Przykład
Poniższy przykład demonstruje ByteArrayOutputStream, aby przesłać obraz na serwer -
Kod klienta
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();
}
}
Kod serwera
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);
}
}
Wynik
Wyjście po stronie klienta
Podczas wykonywania kodu klienta po stronie klienta pojawia się następujący wynik -
Wyjście po stronie serwera
Po wykonaniu kodu serwera po stronie serwera pojawia się następujący plik ouptut -
Po otrzymaniu obrazu serwer wyświetla obraz, jak pokazano poniżej -
Obraz zawiera dwuwymiarową tablicę pikseli. W rzeczywistości jest to wartość tych pikseli, które tworzą obraz. Zwykle obraz może być kolorowy lub w skali szarości.
W Javie klasa BufferedImage służy do obsługi obrazów. Musisz zadzwonićgetRGB() metoda BufferedImage klasa, aby uzyskać wartość piksela.
Pobieranie wartości pikseli
Wartość piksela można uzyskać przy użyciu następującej składni: -
Color c = new Color(image.getRGB(j, i));
Pobieranie wartości RGB
Metoda getRGB()przyjmuje indeks wiersza i kolumny jako parametr i zwraca odpowiedni piksel. W przypadku obrazu kolorowego zwraca trzy wartości (czerwony, zielony, niebieski). Można je uzyskać w następujący sposób:
c.getRed();
c.getGreen();
c.getBlue();
Pobieranie szerokości i wysokości obrazu
Wysokość i szerokość obrazu można uzyskać, wywołując rozszerzenie getWidth() i getHeight()metody klasy BufferedImage. Jego składnia jest podana poniżej -
int width = image.getWidth();
int height = image.getHeight();
Oprócz tych metod klasa BufferedImage obsługuje inne metody. Zostały one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | copyData(WritableRaster outRaster) Oblicza dowolny prostokątny region BufferedImage i kopiuje go do określonego WritableRaster. |
2 | getColorModel() Zwraca ColorModel obrazu. |
3 | getData() Zwraca obraz jako jedną dużą płytkę. |
4 | getData(Rectangle rect) Oblicza i zwraca dowolny region BufferedImage. |
5 | getGraphics() Ta metoda zwraca Graphics2D, ale jest tutaj w celu zapewnienia zgodności wstecznej. |
6 | getHeight() Zwraca wysokość BufferedImage. |
7 | getMinX() Zwraca minimalną współrzędną x tego BufferedImage. |
8 | getMinY() Zwraca minimalną współrzędną y tego BufferedImage. |
9 | getRGB(int x, int y) Zwraca piksel będący liczbą całkowitą w domyślnym modelu kolorów RGB (TYPE_INT_ARGB) i domyślnej przestrzeni kolorów sRGB. |
10 | getType() Zwraca typ obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy java BufferedImage, która wyświetla piksele obrazu o rozmiarze (100 x 100) -
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();
}
}
Wynik
Po wykonaniu powyższego przykładu wydrukowałby piksele następującego obrazu -
Original Image
Pixels Output
Jeśli przewiniesz wyjście, zobaczysz następujący wzorzec -
Aby przekonwertować obraz kolorowy na obraz w skali szarości, należy odczytać piksele lub dane obrazu za pomocą File i ImageIO obiekty i zapisz obraz w formacie BufferedImageobiekt. Jego składnia jest podana poniżej -
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
Ponadto uzyskaj wartość piksela za pomocą metody getRGB()i wykonaj na nim metodę GrayScale (). Metoda getRGB () przyjmuje jako parametr indeks wiersza i kolumny.
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);
Oprócz tych trzech metod w klasie Color dostępne są inne metody, jak opisano w skrócie -
Sr.No. | Metoda i opis |
---|---|
1 | brighter() Tworzy nowy kolor, który jest jaśniejszą wersją tego koloru. |
2 | darker() Tworzy nowy kolor, który jest ciemniejszą wersją tego koloru. |
3 | getAlpha() Zwraca składnik alfa z zakresu 0-255. |
4 | getHSBColor(float h, float s, float b) Tworzy obiekt Color na podstawie określonych wartości dla modelu kolorów HSB. |
5 | HSBtoRGB(float hue, float saturation, float brightness) Konwertuje składniki koloru, zgodnie z modelem HSB, na równoważny zestaw wartości dla domyślnego modelu RGB. |
6 | toString() Zwraca ciąg reprezentujący ten Color. |
Ostatnim krokiem jest dodanie wszystkich tych trzech wartości i ponowne ustawienie odpowiedniej wartości piksela. Jego składnia jest podana poniżej -
int sum = red+green+blue;
Color newColor = new Color(sum,sum,sum);
image.setRGB(j,i,newColor.getRGB());
Przykład
Poniższy przykład ilustruje użycie klasy Java BufferedImage, która konwertuje obraz na skalę szarości -
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();
}
}
Wynik
Kiedy wykonujesz podany przykład, konwertuje on obraz digital_image_processing.jpg do odpowiadającego mu obrazu w skali szarości i zapisz go na dysku twardym pod nazwą grayscale.jpg.
Oryginalny obraz
Obraz w skali szarości
Z tego rozdziału dowiesz się, jak zwiększyć kontrast obrazu za pomocą korekcji histogramu.
Używamy OpenCV funkcjonować equalizeHist()metoda. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
Imgproc.equalizeHist(source, destination);
Parametry opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | Source Jest to 8-bitowy obraz źródłowy pojedynczego kanału. |
2 | Destination To jest obraz docelowy. |
Oprócz metody equalizeHist () istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład demonstruje użycie klasy Imgproc w celu zwiększenia kontrastu obrazu -
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Obraz o zwiększonym kontraście
W tym rozdziale poprawiamy jasność obrazu, mnożąc każdy piksel obrazu przez wartość alfa i dodając do niego kolejną wartość beta.
My OpenCV funkcjonować convertToto wykonuje powyższą operację automatycznie. Można go znaleźć podMatpakiet. Jego składnia jest podana poniżej -
int alpha = 2;
int beta = 50;
sourceImage.convertTo(destination, rtype , alpha, beta);
Parametry opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | destination To jest obraz docelowy. |
2 | rtype Jest to pożądany typ macierzy wyjściowej, a raczej głębokość, ponieważ liczba kanałów jest taka sama, jak ma wejście. jeśli rtype jest ujemne, macierz wyjściowa będzie miała ten sam typ co wejście. |
3 | alpha Jest to opcjonalny współczynnik skali. |
4 | beta Jest to opcjonalna delta dodawana do skalowanych wartości. |
Oprócz metody convertTo istnieją inne metody udostępniane przez klasę Mat. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | adjustROI(int dtop, int dbottom, int dleft, int dright) Dostosowuje rozmiar i położenie podmacierzy w macierzy macierzystej. |
2 | copyTo(Mat m) Kopiuje matrycę do innej. |
3 | diag() Wydobywa przekątną z macierzy lub tworzy matrycę przekątną. |
4 | dot(Mat m) Oblicza iloczyn skalarny dwóch wektorów. |
5 | reshape(int cn) Zmienia kształt i / lub liczbę kanałów macierzy 2D bez kopiowania danych. |
6 | submat(Range rowRange, Range colRange) Wydobywa prostokątną matrycę pomocniczą. |
Przykład
Poniższy przykład demonstruje użycie klasy Mat w celu zwiększenia jasności obrazu -
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Ulepszony jasny obraz (Alfa = 1 i Beta = 50)
Ulepszony jasny obraz (alfa = 2 i beta = 50)
W tym rozdziale nauczymy się zwiększać ostrość obrazu za pomocą filtra Gaussa.
Najpierw używamy OpenCV funkcjonować GaussianBlur. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
Imgproc.GaussianBlur(source, destination, new Size(0,0), sigmaX);
Parametry opisano w skrócie -
Sr.No. | Parametr i opis |
---|---|
1 | source To jest obraz źródłowy. |
2 | destination To jest obraz docelowy. |
3 | Size Jest to rozmiar jądra Gaussa. |
4 | sigmaX Jest to odchylenie standardowe jądra Gaussa w kierunku X. |
Ponadto używamy OpenCV funkcjonować addWeightedaby zastosować znak wodny obrazu do obrazu. Można go znaleźć podCorepakiet. Jego składnia jest podana poniżej -
Core.addWeighted(InputArray src1, alpha, src2, beta, gamma, OutputArray dst);
Parametry tej funkcji opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | src1 Jest to pierwsza tablica wejściowa. |
2 | alpha Jest to waga pierwszych elementów tablicy. |
3 | src2 Jest to druga tablica wejściowa o takim samym rozmiarze i numerze kanału jak src1. |
4 | Beta Jest to waga drugich elementów tablicy. |
5 | gamma Jest to wartość skalarna dodawana do każdej sumy. |
6 | dst Jest to tablica wyjściowa, która ma taki sam rozmiar i liczbę kanałów jak tablice wejściowe. |
Oprócz metody GaussianBlur istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład demonstruje użycie klasy Imgproc i Core w celu zastosowania wyostrzania do obrazu -
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) {
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Ostry obraz
Obraz można łatwo skompresować i zapisać za pomocą języka Java. Kompresja obrazu obejmuje konwersję obrazu do formatu jpg i przechowywanie go.
Aby skompresować obraz, odczytujemy go i konwertujemy na obiekt BufferedImage.
Ponadto otrzymujemy ImageWriter z getImageWritersByFormatName()metoda znaleziona w klasie ImageIO. Z tego ImageWriter utwórz plikImageWriteParamobiekt. Jego składnia jest podana poniżej -
Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();
Z tego obiektu ImageWriteParam można ustawić kompresję, wywołując te dwie metody, którymi są setCompressionMode() i setCompressionQuality(). Ich składnia jest taka, jak podano poniżej -
obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);
Metoda setCompressionMode () przyjmuje jako parametr Mode_EXPLICIT. Niektóre z pozostałych TRYBÓW są krótko opisane -
Sr.No. | Tryby |
---|---|
1 | MODE_DEFAULT Jest to stała wartość, którą można przekazać do metod, aby umożliwić tę funkcję w przyszłych zapisach. |
2 | MODE_DISABLED Jest to stała wartość, którą można przekazać do metod, aby wyłączyć tę funkcję dla przyszłych zapisów. |
3 | MODE_EXPLICIT Jest to stała wartość, którą można przekazać do metod, aby umożliwić tę funkcję w przyszłych zapisach. |
Oprócz metod kompresji istnieją inne metody udostępniane przez klasę ImageWriteParam. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | canOffsetTiles() Zwraca prawdę, jeśli piszący może wykonać kafelkowanie z niezerowymi przesunięciami siatki podczas pisania. |
2 | getBitRate(float quality) Zwraca liczbę zmiennoprzecinkową wskazującą szacunkową liczbę bitów danych wyjściowych dla każdego bitu danych obrazu wejściowego na danym poziomie jakości. |
3 | getLocale() Zwraca aktualnie ustawione ustawienie regionalne lub null, jeśli obsługiwane jest tylko domyślne ustawienie regionalne. |
4 | isCompressionLossless() Zwraca wartość true, jeśli bieżący typ kompresji zapewnia kompresję bezstratną. |
5 | unsetCompression() Usuwa wszelkie poprzednie ustawienia typu kompresji i jakości. |
6 | unsetTiling() Usuwa wszystkie poprzednie parametry siatki kafelków określone przez wywołania setTiling. |
Przykład
Poniższy przykład ilustruje użycie klasy ImageWriteParam do skompresowania obrazu -
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();
}
}
Wynik
Po uruchomieniu podanego kodu kompresuje obraz digital_image_processing.jpg do swojego odpowiednika skompresowanego obrazu i zapisuje go na dysku twardym pod nazwą compress.jpg.
Oryginalny obraz
Skompresowany obraz - współczynnik jakości - 0,05
Skompresowany obraz - współczynnik jakości - 0,5
W tym rozdziale nauczymy się dodawać różne typy ramek do obrazu.
Używamy OpenCV funkcjonować copyMakeBorder. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
Imgproc.copyMakeBorder(source,destination,top,bottom,left,right,borderType);
Parametry opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | source To jest obraz źródłowy. |
2 | destination To jest obraz docelowy. |
3 | top Jest to długość w pikselach obramowania u góry obrazu. |
4 | bottom Długość w pikselach obramowania na dole obrazu. |
5 | left Jest to długość w pikselach krawędzi po lewej stronie obrazu. |
6 | right Jest to długość w pikselach krawędzi po prawej stronie obrazu. |
7 | borderType Określa rodzaj obramowania. Możliwe granice to BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_CONSTANT itd. |
Oprócz metody copyMakeBorder () istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład demonstruje użycie klasy Imgproc w celu dodania obramowania do obrazu -
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Obraz na białym tle
Obramowany obraz obramowania
Odbij obramowanie obrazu
Piramida obrazu to nic innego jak metoda wyświetlania obrazu o wielu rozdzielczościach. Najniższa warstwa to wersja obrazu o najwyższej rozdzielczości, a najwyższa warstwa to wersja obrazu o najniższej rozdzielczości. Piramidy obrazów służą do obsługi obrazów w różnych skalach.
W tym rozdziale wykonujemy próbkowanie w dół i w górę na obrazach.
Używamy OpenCV Funkcje pyrUp i pyrDown. Można je znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
Imgproc.pyrUp(source, destination, destinationSize);
Imgproc.pyrDown(source, destination,destinationSize);
Parametry opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | source To jest obraz źródłowy. |
2 | destination To jest obraz docelowy. |
3 | destinationSize Jest to rozmiar obrazu wyjściowego. Domyślnie jest obliczany jako Rozmiar ((src.cols * 2), (src.rows * 2)). |
Oprócz metod pyrUp i pyrDown istnieją inne metody dostarczane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc do wykonywania próbkowania w górę i w dół na obrazie.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Na oryginalnym obrazie wykonywane są pyrUp (próbkowanie w górę) i pyrDown (próbkowanie w dół). Wyjście po próbkowaniu jest takie, jak pokazano poniżej -
Obraz PyrUP
pyrDown Image
Progowanie pozwala w najprostszy sposób uzyskać segmentację obrazu. Segmentacja obrazu oznacza podzielenie całego obrazu na zestaw pikseli w taki sposób, aby piksele w każdym zestawie miały pewne wspólne cechy. Segmentacja obrazu jest bardzo przydatna przy definiowaniu obiektów i ich granic.
W tym rozdziale wykonujemy podstawowe operacje progowania na obrazach.
Używamy OpenCV funkcjonować threshold. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
Imgproc.threshold(source, destination, thresh , maxval , type);
Parametry opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | source To jest obraz źródłowy. |
2 | destination To jest obraz docelowy. |
3 | thresh Jest to wartość progowa. |
4 | maxval Jest to maksymalna wartość, która może być używana z typami progów THRESH_BINARY i THRESH_BINARY_INV. |
5 | type Możliwe typy to THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC i THRESH_TOZERO. |
Oprócz tych metod progowania istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład demonstruje użycie klasy Imgproc do wykonywania operacji progowych na obrazie -
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Na powyższym oryginalnym obrazie wykonywane są pewne operacje progowania, które pokazano na poniższym wyjściu -
Thresh Binary
Binarne odwrócenie Thresha
Thresh Zero
Kształt obrazu można łatwo zmienić za pomocą OpenCV. Obraz można odwracać, skalować lub obracać w dowolnym z czterech kierunków.
Aby zmienić kształt obrazu, odczytujemy obraz i konwertujemy na obiekt Mat. Jego składnia jest podana poniżej -
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
Odwracanie obrazu
OpenCV pozwala na trzy rodzaje kodów odwracania, które opisano poniżej -
Sr.No. | Odwróć kod i opis |
---|---|
1 | 0 0 oznacza, odwracanie wokół osi x. |
2 | 1 1 oznacza, odwracanie wokół osi y. |
3 | -1 -1 oznacza odwracanie wokół obu osi. |
Przekazujemy odpowiedni kod odwracania do metody flip() w Coreklasa. Jego składnia jest podana poniżej -
Core.flip(source mat, destination mat1, flip_code);
Metoda flip() przyjmuje trzy parametry - źródłową matrycę obrazu, docelową matrycę obrazu i odwrócony kod.
Oprócz metody odwracania istnieją inne metody dostarczane przez klasę Core. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | add(Mat src1, Mat src2, Mat dst) Oblicza sumę dwóch tablic na element lub tablicę i wartość skalarną. |
2 | bitwise_and(Mat src1, Mat src2, Mat dst) Oblicza bitową koniunkcję dla każdego elementu dwóch tablic lub tablicy i wartości skalarnej. |
3 | bitwise_not(Mat src, Mat dst) Odwraca każdy bit tablicy. |
4 | circle(Mat img, Point center, int radius, Scalar color) Rysuje okrąg. |
5 | sumElems(Mat src) Rozmywa obraz za pomocą filtra Gaussa. |
6 | subtract(Mat src1, Scalar src2, Mat dst, Mat mask) Oblicza różnicę na element między dwiema tablicami lub tablicą i wartością skalarną. |
Przykład
Poniższy przykład demonstruje użycie klasy Core do odwrócenia obrazu -
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());
}
}
}
Wynik
Uruchomienie powyższego przykładu spowoduje odwrócenie nazwy obrazu digital_image_processing.jpg do odpowiadającego mu obrazu przestrzeni kolorów HSV i zapisz go na dysku twardym z nazwą flip.jpg.
Oryginalny obraz
Odwrócony obraz
W tym rozdziale zastosujemy filtr Gaussa do obrazu, który rozmywa obraz. Zamierzamy użyć funkcji OpenCV GaussianBlur, aby zastosować filtr Gaussa do obrazów. Można go znaleźć w pakiecie Imgproc. Jego składnia jest podana poniżej -
Imgproc.GaussianBlur(source, destination,Size,SigmaX);
Argumenty funkcji opisano poniżej -
Sr.No. | Argument i opis |
---|---|
1 | source To jest obraz źródłowy. |
2 | destination To jest obraz docelowy. |
3 | Size Jest to rozmiar jądra Gaussa. |
4 | SigmaX Jest to odchylenie standardowe jądra Gaussa w kierunku X. |
Oprócz metody GaussianBlur istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc w celu zastosowania filtru Gaussa do obrazu.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Kiedy ten oryginalny obraz jest spleciony z filtrem Gaussa o rozmiarze 11 i 45, widoczny jest następujący wynik.
Filtr Gaussa o rozmiarze 11
Filtr Gaussa o rozmiarze 45
Stosujemy filtr Box, który rozmywa obraz. Filtr pudełkowy może mieć wymiary 3x3, 5x5, 9x9 itd.
Używamy OpenCV funkcjonować filter2Daby zastosować filtr Box do obrazów. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argument i opis |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | depth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Oprócz metody filter2D () istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc w celu zastosowania filtru Box do obrazu w skali szarości.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
W tym przykładzie konwertujemy nasz obraz za pomocą następującego filtru (jądra). Ten filtr powoduje rozmycie obrazu wraz ze wzrostem jego rozmiaru.
Ten oryginalny obraz został połączony z filtrem pudełkowym o rozmiarze 5, który jest podany poniżej -
Filtr skrzynkowy o rozmiarze 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 |
Obraz splotu (z filtrem pudełkowym o rozmiarze 5)
Obraz skręcony (z filtrem pudełkowym o rozmiarze 9)
W tym rozdziale nauczymy się stosować dwa bardzo popularne operatory morfologii: dylatację i erozję.
Używamy OpenCV funkcjonować erode i dilate. Można je znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
Imgproc.erode(source, destination, element);
Imgproc.dilate(source, destination, element);
Parametry opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | source To jest obraz źródłowy. |
2 | destination To jest obraz docelowy. |
3 | element Jest to element strukturyzujący używany do erozji i dylatacji, jeśli element = Mat (), używany jest prostokątny element strukturyzujący 3 x 3. |
Oprócz metod erode () i dilate () istnieją inne metody dostarczane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc do wykonywania erozji i dylatacji na obrazie -
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Na powyższym oryginalnym obrazie wykonano pewne operacje erozji i dylatacji, które pokazano na poniższym wydruku -
Erozja
Rozszerzanie się
W tym rozdziale poznamy dwa sposoby umieszczania znaku wodnego na obrazach. Te sposoby to -
- Stosowanie tekstowego znaku wodnego
- Stosowanie znaku wodnego obrazu
Stosowanie tekstowego znaku wodnego
Używamy OpenCV funkcjonować putTextaby zastosować tekstowy znak wodny do obrazu. Można go znaleźć podCorepakiet. Jego składnia jest podana poniżej -
Core.putText(source, Text, Point, fontFace ,fontScale , color);
Parametry tej funkcji opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | Source To jest obraz źródłowy. |
2 | Text Jest to ciąg tekstowy, który pojawiłby się na obrazku. |
3 | Point Jest to punkt, w którym tekst powinien pojawić się na obrazie. |
4 | fontFace Typ czcionki. Na przykład - FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX itp. |
5 | fontScale Jest to współczynnik skali czcionki pomnożony przez rozmiar podstawowy danej czcionki. |
6 | color To jest kolor tekstu. |
Oprócz metody putText istnieją inne metody dostarczane przez klasę Core. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | normalize(Mat src, Mat dst, double alpha, double beta, int norm_type) Normalizuje normę lub zakres wartości tablicy. |
2 | perspectiveTransform(Mat src, Mat dst, Mat m) Wykonuje perspektywiczną transformację macierzy wektorów. |
3 | phase(Mat x, Mat y, Mat angle) Oblicza kąt obrotu wektorów 2D. |
4 | rectangle(Mat img, Point pt1, Point pt2, Scalar color) Rysuje prosty, gruby lub wypełniony prostokąt w prawo. |
5 | reduce(Mat src, Mat dst, int dim, int rtype, int dtype) Redukuje macierz do wektora. |
6 | transform(Mat src, Mat dst, Mat m) Wykonuje transformację macierzy każdego elementu tablicy. |
Przykład
Poniższy przykład demonstruje użycie klasy Core do zastosowania tekstowego znaku wodnego na obrazie -
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Obraz ze znakiem wodnym tekstu
Stosowanie znaku wodnego obrazu na obrazie
Będziemy używać OpenCV funkcjonować addWeightedaby zastosować znak wodny obrazu do obrazu. Można go znaleźć podCorepakiet. Jego składnia jest podana poniżej -
Core.addWeighted(InputArray src1, alpha, src2 (Watermark image), beta, gamma, OutputArray dst);
Parametry tej funkcji opisano poniżej -
Sr.No. | Parametr i opis |
---|---|
1 | src1 Jest to pierwsza tablica wejściowa. |
2 | alpha Jest to waga pierwszych elementów tablicy. |
3 | src2 Jest to druga tablica wejściowa o takim samym rozmiarze i numerze kanału jak src1. |
4 | beta Jest to waga drugich elementów tablicy. |
5 | gamma Jest to wartość skalarna dodawana do każdej sumy. |
6 | dst Jest to tablica wyjściowa, która ma taki sam rozmiar i liczbę kanałów jak tablice wejściowe. |
Przykład
Poniższy przykład demonstruje użycie klasy Core do zastosowania znaku wodnego obrazu do obrazu -
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Obraz znaku wodnego
Obraz ze znakiem wodnym
Konwolucja jest operacją matematyczną na dwóch funkcjach f i g. Funkcją f ig w tym przypadku są obrazy, ponieważ obraz jest również funkcją dwuwymiarową.
Wykonywanie konwolucji
Aby wykonać splot na obrazie, podejmowane są następujące kroki -
- Odwróć maskę (poziomo i pionowo) tylko raz.
- Wsuń maskę na obraz.
- Pomnóż odpowiednie elementy, a następnie dodaj je.
- Powtarzaj tę procedurę, aż wszystkie wartości obrazu zostaną obliczone.
Używamy OpenCV funkcjonować filter2Dzastosować splot do obrazów. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argument i opis |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | depth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc do wykonywania konwolucji na obrazie Skala szarości.
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());
}
}
}
Wynik
W tym przykładzie konwertujemy nasz obraz za pomocą następującego filtru (jądra). Ten filtr powoduje utworzenie oryginalnego obrazu takim, jakim jest -
0 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
Oryginalny obraz
Convolved Image
Operator Prewitt służy do wykrywania krawędzi obrazu. Wykrywa dwa rodzaje krawędzi: pionowe i poziome.
Używamy OpenCV funkcjonować filter2Daby zastosować operator Prewitt do obrazów. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argument i opis |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | depth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Oprócz metody filter2D istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc w celu zastosowania operatora Prewitt do obrazu w skali szarości.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Ten oryginalny obraz jest spleciony z operatorem Prewitt pionowych krawędzi, jak podano poniżej -
Kierunek pionowy
-1 | 0 | 1 |
-1 | 0 | 1 |
-1 | 0 | 1 |
Obraz skręcony (kierunek pionowy)
Ten oryginalny obraz również został spleciony z operatorem Prewitt krawędzi poziomych, który podano poniżej -
Kierunek poziomy
-1 | -1 | -1 |
0 | 0 | 0 |
1 | 1 | 1 |
Obraz skręcony (kierunek poziomy)
Operator Sobela jest bardzo podobny do operatora Prewitt. Jest to również maska pochodna i służy do wykrywania krawędzi. Operator Sobela jest używany do wykrywania dwóch rodzajów krawędzi na obrazie: pionowych krawędzi kierunkowych i poziomych krawędzi kierunkowych.
Będziemy używać OpenCV funkcjonować filter2Daby zastosować operator Sobela do obrazów. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argument |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | depth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Oprócz metody filter2D istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc w celu zastosowania operatora Sobel do obrazu w skali szarości.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Ten oryginalny obraz jest spleciony z operatorem Sobela pionowych krawędzi, który podano poniżej -
Kierunek pionowy
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
Obraz skręcony (kierunek pionowy)
Ten oryginał jest spleciony z operatorem Sobela krawędzi poziomych, który podano poniżej -
Kierunek poziomy
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
Obraz skręcony (kierunek poziomy)
Maski kompasu Kirscha to kolejny rodzaj maski pochodnej, która jest używana do wykrywania krawędzi. Ten operator jest również znany jako maska kierunku. W tym operatorze bierzemy jedną maskę i obracamy ją we wszystkich ośmiu kierunkach kompasu, aby uzyskać krawędzie ośmiu kierunków.
Będziemy używać OpenCV funkcjonować filter2Dzastosować operator Kirscha do obrazów. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argument |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | depth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Oprócz metody filter2D () istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc do zastosowania operatora Kirscha do obrazu w skali szarości.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Ten oryginalny obraz jest spleciony z operatorem Kirscha wschodnich krawędzi, który, jak podano poniżej -
Kirsch East
-3 | -3 | -3 |
-3 | 0 | -3 |
5 | 5 | 5 |
Convolved Image (Kirsch East)
Ten oryginalny obraz jest spleciony z operatorem Kirscha krawędzi południowo-zachodnich, który jak podano poniżej -
Kirsch South West
5 | 5 | -3 |
5 | 0 | -3 |
-3 | -3 | -3 |
Convolved Image (Kirsch South West)
Maski kompasu Robinsona to kolejny rodzaj masek pochodnych, które są używane do wykrywania krawędzi. Ten operator jest również znany jako maska kierunku. W tym operatorze bierzemy jedną maskę i obracamy ją we wszystkich ośmiu głównych kierunkach, aby uzyskać krawędzie ośmiu kierunków.
Będziemy używać OpenCV funkcjonować filter2Daby zastosować operator Robinsona do obrazów. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argument i opis |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | depth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Oprócz metody filter2D istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc w celu zastosowania operatora Robinson do obrazu w skali szarości.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Ten oryginalny obraz jest spleciony z operatorem Robinsona krawędzi północnych, jak podano poniżej -
Maska kierunku północnego
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
Convolved Image (Robinson North)
Ten oryginalny obraz został również połączony z operatorem Robinsona wschodnich krawędzi, jak podano poniżej -
Maska kierunku wschodniego
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
Convolved Image (Robinson East)
Operator Laplaciana jest także operatorem pochodnym, który służy do znajdowania krawędzi obrazu. Główną różnicą między operatorami Laplacian a innymi operatorami, takimi jak Prewitt, Sobel, Robinson i Kirsch, jest to, że wszystkie są maskami pochodnymi pierwszego rzędu, ale Laplacian jest maską pochodną drugiego rzędu.
Używamy OpenCV funkcjonować filter2Dzastosować operator Laplacian do obrazów. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argumenty |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | depth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Oprócz metody filter2D () istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc w celu zastosowania operatora Laplacian do obrazu w skali szarości.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Ten oryginalny obraz jest spleciony z operatorem Laplacian Negative, jak podano poniżej -
Laplacian Negative
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Obraz splotu (Laplacian Negative)
Ten oryginalny obraz jest spleciony z operatorem Laplacian Positive, jak podano poniżej -
Laplacian Positive
0 | 1 | 0 |
1 | -4 | 1 |
0 | 1 | 0 |
Obraz skręcony (Laplacian Positive)
W filtrze średniej ważonej przypisaliśmy większą wagę wartości środkowej, dzięki czemu wkład środka staje się większy niż reszta wartości. Dzięki filtrowaniu średniej ważonej możemy kontrolować rozmycie obrazu.
Używamy OpenCV funkcjonować filter2Daby zastosować do obrazów filtr średniej ważonej. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argument i opis |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | ddepth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Oprócz metody filter2D () istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc w celu zastosowania filtru średniej ważonej do obrazu 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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Ten oryginalny obraz jest spleciony z filtrem średniej ważonej, jak podano poniżej -
Filtr średniej ważonej
1 | 1 | 1 |
1 | 10 | 1 |
1 | 1 | 1 |
Convolved Image
Powiększanie to proces powiększania obrazu, dzięki czemu szczegóły obrazu stają się bardziej widoczne i wyraźne.
Używamy OpenCV funkcjonować resizeaby zastosować powiększanie do obrazów. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
Imgproc.resize(source,destination, destination.size(),zoomFactor,zoomFactor,Interpolation);
W funkcji zmiany rozmiaru przekazujemy obraz źródłowy, obraz docelowy i jego rozmiar, współczynnik powiększenia oraz metodę interpolacji.
Dostępne metody interpolacji opisano poniżej -
Sr.No. | Metoda interpolacji i opis |
---|---|
1 | INTER_NEAREST Jest to interpolacja najbliższego sąsiada. |
2 | INTER_LINEAR Jest to interpolacja dwuliniowa (używana domyślnie). |
3 | INTER_AREA Jest to ponowne próbkowanie przy użyciu relacji obszaru pikseli. Może to być preferowana metoda dziesiątkowania obrazów, ponieważ daje bardziej swobodne wyniki. |
4 | INTER_CUBIC Jest to interpolacja dwu sześcienna w sąsiedztwie pikseli 4x4. |
5 | INTER_LANCZOS4 Jest to interpolacja Lanczosa w sąsiedztwie 8x8 pikseli. |
Oprócz metody zmiany rozmiaru istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc w celu zastosowania powiększenia do obrazu.
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());
}
}
}
Wynik
Kiedy wykonujesz podany kod, zobaczysz następujące dane wyjściowe -
Oryginalny obraz
Powiększony obraz (współczynnik powiększenia - 2)
W tym rozdziale omówimy niektóre z bezpłatnych bibliotek przetwarzania obrazu, które są szeroko używane i można je łatwo zintegrować z projektem. Te biblioteki obejmują -
- ImageJ
- Fiji
- Commons Imaging
- ImageMagick
- Endrov
- LeadTools
- OpenCv
ImageJ
ImageJ to publiczny program do przetwarzania obrazów Java zainspirowany NIH Image dla komputerów Macintosh. Może wyświetlać, edytować, analizować, przetwarzać, zapisywać i drukować obrazy 8-bitowe, 16-bitowe i 32-bitowe.
Niektóre z podstawowych funkcji ImageJ opisano poniżej -
Sr.No. | Funkcja i opis |
---|---|
1 | Runs Everywhere ImageJ jest napisany w Javie, dzięki czemu może działać w systemach Linux, Mac OS X i Windows, zarówno w trybie 32-bitowym, jak i 64-bitowym. |
2 | Open Source ImageJ i jego kod źródłowy Java są dostępne bezpłatnie i należą do domeny publicznej. |
3 | Toolkit Użyj ImageJ jako zestawu narzędzi do przetwarzania obrazu (biblioteki klas) do tworzenia apletów, serwletów lub aplikacji. |
4 | Data Types 8-bitowa skala szarości lub kolor indeksowany, 16-bitowa liczba całkowita bez znaku, 32-bitowa liczba zmiennoprzecinkowa i kolor RGB. |
5 | File Formats Otwórz i zapisz pliki GIF, JPEG, BMP, PNG, PGM, FITS i ASCII. Otwórz DICOM. Otwieraj pliki TIFF, GIF, JPEG, DICOM i surowe dane przy użyciu adresu URL. |
6 | Selections Utwórz prostokątne, eliptyczne lub nieregularne zaznaczenia obszarów. Utwórz zaznaczenia linii i punktów. |
7 | Image Enhancement Obsługuje wygładzanie, wyostrzanie, wykrywanie krawędzi, filtrowanie mediany i progowanie zarówno dla 8-bitowych obrazów w skali szarości, jak i kolorowych obrazów RGB. |
8 | Color Processing Podziel 32-bitowy kolorowy obraz na komponenty RGB lub HSV. Scal komponenty 8-bitowe w kolorowy obraz. |
Fidżi
Fidżi to pakiet przetwarzania obrazu. Można to opisać jako dystrybucję ImageJ (i ImageJ2) razem z Javą, Java3D i wieloma wtyczkami zorganizowanymi w spójną strukturę menu. Fidżi porównuje się do ImageJ, podobnie jak Ubuntu do Linuksa.
Oprócz podstawowych funkcji ImageJ, poniżej opisano niektóre zaawansowane funkcje Fidżi -
Sr.No. | Funkcja i opis |
---|---|
1 | Registering 3D images Obejmuje to elastyczne wyrównanie i montaż, wyodrębnianie funkcji, stabilizator obrazu itp. |
2 | Segmenting images Oferuje ponad 35 rodzajów segmentacji. |
3 | Useful keyboard short cuts Fuji ma wiele skrótów klawiaturowych. |
4 | Scripting Zezwalaj na pisanie skryptów za pomocą makr, w JavaScript, JRuby, Jython, Clojure i Beanshell. |
5 | Developing Plug-ins Użyj Edytora skryptów, aby rozpocząć tworzenie wtyczek, a następnie uruchom wtyczki. |
6 | ImageJ Tricks ImageJ jest łatwy w użyciu, ale czasami potrzebujesz jakiejś funkcji, która jest faktycznie zaimplementowana, ale nie wiesz, jak ją wyzwolić. |
Commons Imaging
Apache Commons Imaging, wcześniej znane jako Apache Commons Sanselan, to biblioteka, która czyta i zapisuje różne formaty obrazów, w tym szybką analizę informacji o obrazie, takich jak (rozmiar, kolor, przestrzeń, profil ICC itp.) Oraz metadane.
Niektóre z podstawowych funkcji ImageJ opisano poniżej -
Sr.No. | Funkcja i opis |
---|---|
1 | Java Apache Commons Imaging jest napisane w 100% w czystej Javie. Działa na dowolnej JVM i dowolnej platformie bez modyfikacji. |
2 | Image Formats Czyta i zapisuje szeroką gamę formatów graficznych i obsługuje niektóre odmiany i kodowania, których brakuje we wszystkich lub większości innych bibliotek. |
3 | Metadata support Obsługuje odczytywanie i zapisywanie różnych metadanych w uporządkowany sposób, w tym metadanych EXIF. |
4 | Network Friendly Jest przyjazny dla sieci. Commons Imaging odczytuje tylko potrzebne dane i buforuje to, co jest czytane, aby nie było zbyt obciążające w sieci. |
5 | Easy to use Został zaprojektowany tak, aby był bardzo łatwy w użyciu. Posiada prosty, przejrzysty interfejs. Większość operacji to pojedyncze wywołania metody obrazowania. |
6 | Transparent Commons Imaging dąży do zachowania przejrzystości. Nie ma żadnych ukrytych buforów do usunięcia, pamięci natywnej do zwolnienia ani wątków w tle. |
7 | Open Source To jest wolne oprogramowanie / otwarte źródło. Jest dostępny na licencji oprogramowania Apache. |
8 | Color Conversions Klasa ColorConversions oferuje metody konwersji między następującymi przestrzeniami kolorów - CIE-L * CH, CIE-L * ab, CIE-L * uv, CMY, CMYK, HSL, HSV, Hunter-Lab, RGB, XYZ i YXY. |
ImageMagick
ImageMagick to pakiet oprogramowania do tworzenia, edycji, komponowania lub konwertowania obrazów bitmapowych. Może czytać i zapisywać obrazy w ponad 100 formatach, w tym DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PNG, Postscript, SVG i TIFF. Użyj ImageMagick, aby zmienić rozmiar, odwrócić, odbić, obracać, zniekształcać, ścinać i przekształcać obrazy, dostosowywać kolory obrazu, stosować różne efekty specjalne lub rysować tekst, linie, wielokąty, elipsy i krzywą Beziera.
Niektóre z podstawowych funkcji ImageMagick opisano poniżej -
Sr.No. | Funkcja i opis |
---|---|
1 | Format conversion Konwertuje obraz z jednego formatu na inny (np. PNG na JPEG). |
2 | Transform Może zmieniać rozmiar, obracać, przycinać, odwracać lub przycinać obraz. |
3 | Transparency Powoduje, że fragmenty obrazu są niewidoczne. |
4 | Draw Dodaje kształty lub tekst do obrazu. |
5 | Decorate Dodaje obramowanie lub ramkę do obrazu. |
6 | Special effects Może rozmyć, wyostrzyć, wyostrzyć lub zabarwić obraz. |
7 | Animation Może tworzyć sekwencję animacji GIF z grupy obrazów. |
8 | Composite Może nakładać się na jeden obraz na inny. |
9 | Morphology of shapes Wyodrębnia cechy, opisuje kształty i rozpoznaje wzory na obrazach. |
10 | Encipher or decipher an image Przekształca zwykłe obrazy w niezrozumiały bełkot iz powrotem. |
Endrov
Endrov to wielofunkcyjny program do analizy obrazu. Jest napisany niezależnie i ma na celu usunięcie wielu niedociągnięć innego wolnego oprogramowania i wielu pakietów komercyjnych.
Niektóre z podstawowych funkcji Endrov opisano poniżej -
Sr.No. | Funkcja i opis |
---|---|
1 | View data Wyświetla dane w 2D i 3D. Zaprojektowany do obsługi złożonych schematów danych 4D i nieograniczonej liczby kanałów, gdzie każdy kanał może mieć własną rozdzielczość X, Y i Z. |
2 | Annotate your images Dodaje adnotacje do obrazów, automatycznie lub ręcznie, aby je zrozumieć i uzyskać statystyki. |
3 | Undo and Redo Może cofać i ponawiać wszystkie operacje. |
4 | Lazy Evaluation Jest zaprojektowany od podstaw do obsługi dużych zestawów obrazów. Endrov stosuje leniwą ocenę, koncepcję dostępną głównie w badaniach języków programowania. |
5 | Scripting language Obsługuje graficzny język skryptowy, a także tradycyjny skrypt. |
6 | Java Napisane w Javie. Architektura wtyczek umożliwia łatwe rozszerzenie za pomocą nowych wtyczek Java. Może współdziałać z Matlabem. |
7 | Formats Uzyskuje dostęp do prawie wszystkich komercyjnych i otwartych formatów plików przy użyciu formatów Bio. |
8 | Microscopic Processing Może sterować wszystkimi mikroskopami za pomocą jednego programu i przeprowadzać analizę obrazu w locie. |
LEADTOOLS
LEADTOOLS zapewnia ponad 200 funkcji przetwarzania obrazu w kilku kategoriach, w tym czyszczenie dokumentów, ulepszanie obrazu medycznego, konwersję i korekcję kolorów, redukcję szumów, wykrywanie krawędzi i wiele innych.
Niektóre z podstawowych funkcji LEADTOOLS opisano poniżej -
Sr.No. | Funkcja i opis |
---|---|
1 | Scanned Document Image Processing Ten potężny zbiór funkcji może odczytywać zeskanowane dokumenty zawierające artefakty i niedoskonałości, takie jak dziurki, przekrzywione kąty, obramowania, drobinki kurzu i inne. |
2 | Medical Image Processing Popraw obraz lub podkreśl szczegóły, przesuwając, zaznaczając, odejmując i usuwając tło w celu uzyskania lepszych efektów wizualnych. |
3 | Geometric Transformation Tych funkcji można używać do czyszczenia, wyrównywania, poprawiania obrazów lub stosowania artystycznych efektów 3D. |
4 | Brightness and Contrast Funkcje te mogą być używane do ulepszania obrazów, stosowania efektów artystycznych lub pomocy w diagnostycznej ocenie obrazów medycznych. |
5 | Color Space Conversion Mogą dodawać funkcje przestrzeni kolorów obrazu do aplikacji jedno- i wielowątkowych, w tym aplikacji hostowanych przez usługi IIS i Windows WF. |
6 | Color Correction Funkcje te służą do korygowania obrazów z zamienionymi kanałami kolorów, równoważenia intensywności kolorów lub wykonywania różnych zadań analizy obrazu. |
7 | Image Enhancement Funkcje te służą do korygowania typowych błędów w fotografii, takich jak efekt czerwonych oczu i niezrównoważonych kolorów, a także pomagają w diagnostycznej ocenie obrazów medycznych. |
8 | Region of Interest Te funkcje są używane do tworzenia i modyfikowania obszarów zainteresowania w obrazach w celu wykonywania funkcji przetwarzania obrazu na określonych częściach obrazu, oszczędzania czasu w zakresie kodów kreskowych i rozpoznawania OCR lub wykonywania różnych zadań analizy obrazu. |
OpenCV
OpenCV jest wydany na licencji BSD i dlatego jest darmowy zarówno do użytku akademickiego, jak i komercyjnego. Posiada interfejsy C ++, C, Python i Java i obsługuje systemy Windows, Linux, Mac OS, iOS i Android. OpenCV został zaprojektowany z myślą o wydajności obliczeniowej i silnym nacisku na aplikacje czasu rzeczywistego. Napisana w zoptymalizowanym C / C ++ biblioteka może korzystać z przetwarzania wielordzeniowego.
Krótko opisano niektóre podstawowe funkcje OpenCV -
Sr.No. | Funkcja i opis |
---|---|
1 | Smoothing Images Obejmuje to zastosowanie Blur, GaussianBlur, medianBlur i dwustronnego filtra. |
2 | Eroding and Dilating Może zastosować dwa bardzo popularne operatory morfologii - rozszerzenie i erozja. |
3 | Morphology Transformations OpenCV function morphologyEx do zastosowania transformacji morfologicznej, takiej jak otwieranie, zamykanie, TopHat i BlackHat itp. |
4 | Image Pyramids Funkcje OpenCV pyrUp i pyrDown pobierają próbkę lub próbkę w górę danego obrazu. |
4 | Basic Thresholding Operations Wykonywanie podstawowych operacji progowania za pomocą funkcji progowej OpenCV. |
5 | Adding borders to your images Funkcja OpenCV copyMakeBorder służy do ustawiania granic (dodatkowe wypełnienie obrazu). |
7 | Remapping W OpenCV funkcja remap oferuje prostą implementację remapowania. |
8 | Histogram Calculation Dla prostych celów OpenCV implementuje funkcję calcHist, która oblicza histogram zestawu tablic (zwykle obrazów lub płaszczyzn obrazów). Może pracować w 32 wymiarach. |
OpenCV jest wydany na licencji BSD i dlatego jest darmowy zarówno do użytku akademickiego, jak i komercyjnego. Posiada interfejsy C ++, C, Python i Java oraz obsługuje systemy Windows, Linux, Mac OS, iOS i Android.
OpenCV został zaprojektowany z myślą o wydajności obliczeniowej i silnym nacisku na aplikacje czasu rzeczywistego. Napisana w zoptymalizowanym C / C ++ biblioteka może korzystać z przetwarzania wielordzeniowego.
Niektóre z podstawowych funkcji OpenCV opisano poniżej -
Sr.No. | Funkcja i opis |
---|---|
1 | Smoothing Images Obejmuje to zastosowanie Blur, GaussianBlur, medianBlur i dwustronnego filtra. |
2 | Eroding and Dilating Może zastosować dwa bardzo popularne operatory morfologii - rozszerzenie i erozja. |
3 | Morphology Transformations OpenCV function morphologyEx do zastosowania transformacji morfologicznej, takiej jak otwieranie, zamykanie, TopHat i BlackHat itp. |
4 | Image Pyramids Funkcje OpenCV pyrUp i pyrDown pobierają próbkę lub próbkę w górę danego obrazu. |
4 | Basic Thresholding Operations Może wykonywać podstawowe operacje progowania za pomocą progu funkcji OpenCV. |
5 | Adding borders to your images Funkcja OpenCV copyMakeBorder służy do ustawiania granic (dodatkowe wypełnienie obrazu). |
7 | Remapping W OpenCV funkcja remap oferuje prostą implementację remapowania. |
8 | Histogram Calculation Dla prostych celów OpenCV implementuje funkcję calcHist, która oblicza histogram zestawu tablic (zwykle obrazów lub płaszczyzn obrazów). Może pracować w 32 wymiarach. |
Integracja OpenCV
Poniższe kroki wyjaśniają, jak zintegrować OpenCV z twoimi aplikacjami.
Pobierz OpenCV
Możesz pobrać OpenCV z ich oficjalnej strony internetowej tutaj .
Utwórz bibliotekę użytkownika
Ponadto tworzymy bibliotekę użytkownika OpenCV, abyśmy mogli używać jej jako przyszłego projektu.
Uruchom Eclipse
Wybierz z menu Okno -> Preferencje.
Przejdź do Java -> Build Path -> User Libraries i kliknij New.
Teraz wprowadź nazwę swojej biblioteki. Na przykład OpenCV-2.4.6.
Następnie wybierz nową bibliotekę użytkownika (np. OpenCV-2.4.6) i kliknij Dodaj zewnętrzne pliki JAR.
Przejrzyj C: \ OpenCV-2.4.6 \ build \ java \ i wybierz opencv-246.jar. Po dodaniu jar, rozszerz plik opencv-246.jar i wybierz lokalizację biblioteki natywnej i naciśnij Edytuj.
Wybierz Folder zewnętrzny ... i przejdź do folderu C: \ OpenCV-2.4.6 \ build \ java \ x64. Jeśli masz system 32-bitowy, musisz wybrać folder x86 zamiast x64.
Naciśnij Ok i gotowe.
Twoja biblioteka użytkownika została utworzona. Teraz możesz ponownie użyć tej konfiguracji w dowolnym projekcie.
Utwórz projekt OpenCV
Utwórz nowy projekt java w eclipse.
W kroku Ustawienia Java, na karcie Biblioteki, wybierz Dodaj bibliotekę ... i wybierz OpenCV-2.4.6, a następnie kliknij Zakończ.
Kliknij Zakończ i gotowe.
Aby przekonwertować obraz kolorowy na obraz w skali szarości przy użyciu OpenCV, wczytujemy obraz do formatu BufferedImage i przekonwertuj go na MatObiekt. Jego składnia jest podana poniżej -
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
Następnie możesz przekształcić obraz z formatu RGB na skalę szarości za pomocą metody cvtColor() w Imgprocklasa. Jego składnia jest podana poniżej -
Imgproc.cvtColor(source mat, destination mat1, Imgproc.COLOR_RGB2GRAY);
Metoda cvtColor() przyjmuje trzy parametry, którymi są matryca obrazu źródłowego, matryca obrazu docelowego i typ konwersji kolorów.
Oprócz metody cvtColor istnieją inne metody dostarczane przez klasę Imgproc. Są one wymienione poniżej -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc do konwersji obrazu na skalę szarości -
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());
}
}
}
Wynik
Kiedy wykonujesz podany przykład, konwertuje on nazwę obrazu digital_image_processing.jpg do swojego odpowiednika obrazu w skali szarości i zapisuje go na dysku twardym z nazwą grayscale.jpg.
Oryginalny obraz
Obraz w skali szarości
Aby zmienić przestrzeń kolorów jednego obrazu na inny za pomocą OpenCV, wczytujemy obraz do BufferedImage i przekonwertuj go na MatObiekt. Jego składnia jest podana poniżej -
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
OpenCv pozwala na wiele typów konwersji kolorów, z których wszystkie można znaleźć w klasie Imgproc. Niektóre typy opisano pokrótce -
Sr.No. | Typ konwersji koloru |
---|---|
1 | COLOR_RGB2BGR |
2 | COLOR_RGB2BGRA |
3 | COLOR_RGB2GREY |
4 | COLOR_RGB2HLS |
5 | COLOR_RGB2HSV |
6 | COLOR_RGB2Luv |
7 | COLOR_RGB2YUV |
8 | COLOR_RGB2Lab |
Z dowolnego typu konwersji kolorów po prostu przekaż odpowiedni do metody cvtColor() w Imgprocklasa. Jego składnia jest podana poniżej -
Imgproc.cvtColor(source mat, destination mat1, Color_Conversion_Code);
Metoda cvtColor() przyjmuje trzy parametry, którymi są matryca obrazu źródłowego, matryca obrazu docelowego i typ konwersji kolorów.
Oprócz metody cvtColor () istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc do konwersji obrazu z jednej przestrzeni kolorów na inną.
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());
}
}
}
Wynik
Kiedy wykonujesz podany przykład, konwertuje on nazwę obrazu digital_image_processing.jpg do odpowiadającego mu obrazu przestrzeni kolorów HSV i zapisuje go na dysku twardym z nazwą hsv.jpg.