Java DIP - Hướng dẫn nhanh
Xử lý hình ảnh kỹ thuật số (DIP) xử lý các thao tác trên hình ảnh kỹ thuật số bằng máy tính kỹ thuật số. Nó là một lĩnh vực phụ của tín hiệu và hệ thống nhưng tập trung đặc biệt vào hình ảnh. DIP tập trung vào việc phát triển một hệ thống máy tính có thể thực hiện xử lý hình ảnh. Đầu vào của hệ thống như vậy là một hình ảnh kỹ thuật số. Hệ thống xử lý hình ảnh bằng các thuật toán hiệu quả và đưa ra hình ảnh làm đầu ra.
Java là một ngôn ngữ lập trình cấp cao được sử dụng rộng rãi trong thế giới hiện đại. Nó có thể hỗ trợ và xử lý xử lý hình ảnh kỹ thuật số hiệu quả bằng cách sử dụng các chức năng khác nhau.
BufferedImage
Lớp Java là một lớp con của lớp Image. Nó được sử dụng để xử lý và thao tác dữ liệu hình ảnh. A BufferedImage
được làm bằng ColorModel của dữ liệu hình ảnh. Tất cả BufferedImage
các đối tượng có tọa độ góc trên bên trái là (0, 0).
Người xây dựng
Lớp này hỗ trợ ba loại hàm tạo.
Hàm tạo đầu tiên tạo mới BufferedImage
với ColorModel và Raster được chỉ định.
BufferedImage(ColorModel cm, WritableRaster raster,
boolean isRasterPremultiplied, Hashtable<?,?> properties)
Hàm tạo thứ hai xây dựng một BufferedImage
trong một trong các kiểu hình ảnh được xác định trước.
BufferedImage(int width, int height, int imageType)
Hàm tạo thứ ba tạo một BufferedImage
trong một trong các kiểu hình ảnh được xác định trước: TYPE_BYTE_BINARY hoặc TYPE_BYTE_INDEXED.
BufferedImage(int width, int height, int imageType, IndexColorModel cm)
Sr.No | Phương pháp & Mô tả |
---|---|
1 | copyData(WritableRaster outRaster) Nó tính toán một vùng hình chữ nhật tùy ý của |
2 | getColorModel() Nó trả về đối tượng của lớp ColorModel của một hình ảnh. |
3 | getData() Nó trả về hình ảnh dưới dạng một ô lớn. |
4 | getData(Rectangle rect) Nó tính toán và trả về một vùng tùy ý của |
5 | getGraphics() Phương thức này trả về một Graphics2D, giữ lại khả năng tương thích ngược. |
6 | getHeight() Nó trả về chiều cao của |
7 | getMinX() Nó trả về tọa độ x tối thiểu của điều này |
số 8 | getMinY() Nó trả về tọa độ y tối thiểu của điều này |
9 | getRGB(int x, int y) Nó trả về một pixel số nguyên trong mô hình màu RGB mặc định (TYPE_INT_ARGB) và không gian màu sRGB mặc định. |
10 | getType() Nó trả về loại hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng BufferedImage
lớp java để vẽ một số văn bản trên màn hình bằng 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);
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Trong chương này, chúng ta sẽ xem cách bạn có thể tải xuống hình ảnh từ internet, thực hiện một số kỹ thuật xử lý hình ảnh trên hình ảnh và sau đó tải lại hình ảnh đã xử lý lên máy chủ.
Tải xuống hình ảnh
Để tải xuống hình ảnh từ một trang web, chúng tôi sử dụng lớp java có tên URL, có thể được tìm thấy dưới java.netgói hàng. Cú pháp của nó được đưa ra dưới đây:
String website = "http://tutorialspoint.com";
URL url = new URL(website);
Ngoài phương thức trên, có các phương thức khác có sẵn trong URL lớp như được mô tả ngắn gọn:
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public String getPath() Nó trả về đường dẫn của URL. |
2 | public String getQuery() Nó trả về phần truy vấn của URL. |
3 | public String getAuthority() Nó trả về thẩm quyền của URL. |
4 | public int getPort() Nó trả về cổng của URL. |
5 | public int getDefaultPort() Nó trả về cổng mặc định cho giao thức của URL. |
6 | public String getProtocol() Nó trả về giao thức của URL. |
7 | public String getHost() Nó trả về máy chủ của URL. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp URL java để tải xuống hình ảnh từ internet -
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
public class Download {
public static void main(String[] args) throws Exception {
try{
String fileName = "digital_image_processing.jpg";
String website = "http://tutorialspoint.com/java_dip/images/"+fileName;
System.out.println("Downloading File From: " + website);
URL url = new URL(website);
InputStream inputStream = url.openStream();
OutputStream outputStream = new FileOutputStream(fileName);
byte[] buffer = new byte[2048];
int length = 0;
while ((length = inputStream.read(buffer)) != -1) {
System.out.println("Buffer Read of length: " + length);
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
} catch(Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
}
Đầu ra
Khi bạn thực hiện điều đã cho ở trên, kết quả sau sẽ được nhìn thấy.
Nó sẽ tải xuống hình ảnh sau từ máy chủ.
Tải lên hình ảnh
Hãy để chúng tôi xem cách tải hình ảnh lên máy chủ web. Chúng tôi chuyển đổi BufferedImage thành mảng byte để gửi nó đến máy chủ.
Chúng tôi sử dụng lớp Java ByteArrayOutputStream, có thể được tìm thấy dưới java.iogói hàng. Cú pháp của nó được đưa ra dưới đây:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
Để chuyển đổi hình ảnh sang mảng byte, chúng tôi sử dụng toByteArray() phương pháp của ByteArrayOutputStreamlớp học. Cú pháp của nó được đưa ra dưới đây:
byte[] bytes = baos.toByteArray();
Ngoài phương thức trên, còn có các phương thức khác có sẵn trong lớp ByteArrayOutputStream như được mô tả ngắn gọn:
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public void reset() Phương thức này đặt lại số lượng byte hợp lệ của luồng đầu ra mảng byte thành 0, do đó tất cả đầu ra tích lũy trong luồng bị loại bỏ. |
2 | public byte[] toByteArray() Phương thức này tạo một mảng Byte mới được cấp phát. Kích thước của nó sẽ là kích thước hiện tại của luồng đầu ra và nội dung của bộ đệm sẽ được sao chép vào đó. Nó trả về nội dung hiện tại của luồng đầu ra dưới dạng một mảng byte. |
3 | public String toString() Chuyển đổi nội dung bộ đệm thành một chuỗi. Việc dịch sẽ được thực hiện theo bảng mã ký tự mặc định. Nó trả về Chuỗi được dịch từ nội dung của bộ đệm. |
4 | public void write(int w) Nó ghi mảng được chỉ định vào luồng đầu ra. |
5 | public void write(byte []b, int of, int len) Nó ghi len số byte bắt đầu từ offset vào luồng. |
6 | public void writeTo(OutputStream outSt) Nó ghi toàn bộ nội dung của Luồng này vào đối số luồng được chỉ định. |
Thí dụ
Ví dụ sau minh họa ByteArrayOutputStream để tải hình ảnh lên máy chủ -
Mã khách hàng
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();
}
}
Mã máy chủ
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);
}
}
Đầu ra
Đầu ra phía máy khách
Khi bạn thực thi mã máy khách, kết quả sau xuất hiện ở phía máy khách:
Đầu ra phía máy chủ
Khi bạn thực thi mã máy chủ, thông báo sau sẽ xuất hiện ở phía máy chủ:
Sau khi nhận được hình ảnh, máy chủ sẽ hiển thị hình ảnh như hình dưới đây -
Một hình ảnh chứa một mảng pixel hai chiều. Nó thực sự là giá trị của những pixel đó tạo nên một hình ảnh. Thông thường, một hình ảnh có thể là màu hoặc thang độ xám.
Trong Java, lớp BufferedImage được sử dụng để xử lý hình ảnh. Bạn cần gọigetRGB() phương pháp của BufferedImage lớp để nhận giá trị của pixel.
Nhận giá trị pixel
Giá trị pixel có thể được nhận bằng cú pháp sau
Color c = new Color(image.getRGB(j, i));
Nhận giá trị RGB
Phương pháp getRGB()lấy chỉ số hàng và cột làm tham số và trả về pixel thích hợp. Trong trường hợp hình ảnh màu, nó trả về ba giá trị là (Đỏ, Xanh lá cây, Xanh lam). Chúng có thể nhận được như sau:
c.getRed();
c.getGreen();
c.getBlue();
Nhận chiều rộng và chiều cao của hình ảnh
Chiều cao và chiều rộng của hình ảnh có thể nhận được bằng cách gọi getWidth() và getHeight()các phương thức của lớp BufferedImage. Cú pháp của nó được đưa ra bên dưới−
int width = image.getWidth();
int height = image.getHeight();
Ngoài các phương thức này, còn có các phương thức khác được hỗ trợ trong lớp BufferedImage. Chúng được mô tả ngắn gọn
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | copyData(WritableRaster outRaster) Nó tính toán một vùng hình chữ nhật tùy ý của BufferedImage và sao chép nó vào một WordsRaster được chỉ định. |
2 | getColorModel() Nó trả về ColorModel của một hình ảnh. |
3 | getData() Nó trả về hình ảnh dưới dạng một ô lớn. |
4 | getData(Rectangle rect) Nó tính toán và trả về một vùng tùy ý của BufferedImage. |
5 | getGraphics() Phương thức này trả về Graphics2D, nhưng ở đây để tương thích ngược. |
6 | getHeight() Nó trả về chiều cao của BufferedImage. |
7 | getMinX() Nó trả về tọa độ x tối thiểu của BufferedImage này. |
số 8 | getMinY() Nó trả về tọa độ y tối thiểu của BufferedImage này. |
9 | getRGB(int x, int y) Nó trả về một pixel số nguyên trong mô hình màu RGB mặc định (TYPE_INT_ARGB) và không gian màu sRGB mặc định. |
10 | getType() Nó trả về loại hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp java BufferedImage hiển thị các pixel của hình ảnh có kích thước (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();
}
}
Đầu ra
Khi bạn thực hiện ví dụ trên, nó sẽ in ra các pixel của hình ảnh sau:
Original Image
Pixels Output
Nếu bạn cuộn xuống tùy chọn, mẫu sau sẽ được nhìn thấy:
Để chuyển đổi hình ảnh màu sang hình ảnh Thang độ xám, bạn cần đọc pixel hoặc dữ liệu của hình ảnh bằng File và ImageIO các đối tượng và lưu trữ hình ảnh trong BufferedImagevật. Cú pháp của nó được đưa ra dưới đây:
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
Hơn nữa, lấy giá trị pixel bằng phương pháp getRGB()và thực hiện phương thức GrayScale () trên đó. Phương thức getRGB () lấy chỉ số hàng và cột làm tham số.
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);
Ngoài ba phương thức này, có những phương thức khác có sẵn trong lớp Màu như được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | brighter() Nó tạo ra một Màu mới là một phiên bản sáng hơn của Màu này. |
2 | darker() Nó tạo ra một Màu mới là phiên bản tối hơn của Màu này. |
3 | getAlpha() Nó trả về thành phần alpha trong phạm vi 0-255. |
4 | getHSBColor(float h, float s, float b) Nó tạo một đối tượng Màu dựa trên các giá trị được chỉ định cho mô hình màu HSB. |
5 | HSBtoRGB(float hue, float saturation, float brightness) Nó chuyển đổi các thành phần của màu, như được chỉ định bởi mô hình HSB, thành một bộ giá trị tương đương cho mô hình RGB mặc định. |
6 | toString() Nó trả về một biểu diễn chuỗi của Màu này. |
Bước cuối cùng là thêm tất cả ba giá trị này và đặt lại thành giá trị pixel tương ứng. Cú pháp của nó được đưa ra dưới đây:
int sum = red+green+blue;
Color newColor = new Color(sum,sum,sum);
image.setRGB(j,i,newColor.getRGB());
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Java BufferedImage để chuyển đổi một hình ảnh sang Grayscale:
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();
}
}
Đầu ra
Khi bạn thực hiện ví dụ đã cho, nó sẽ chuyển đổi hình ảnh digital_image_processing.jpg sang hình ảnh Grayscale tương đương của nó và ghi nó vào đĩa cứng với tên grayscale.jpg.
Ảnh gốc
Hình ảnh thang độ xám
Trong chương này, tìm hiểu cách tăng cường độ tương phản của hình ảnh bằng cách sử dụng cân bằng biểu đồ.
Chúng tôi sử dụng OpenCV chức năng equalizeHist()phương pháp. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
Imgproc.equalizeHist(source, destination);
Các thông số được mô tả bên dưới:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | Source Đây là hình ảnh nguồn kênh đơn 8 bit. |
2 | Destination Nó là hình ảnh đích. |
Ngoài phương thức equalizeHist (), còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để nâng cao độ tương phản của hình ảnh:
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh tương phản nâng cao
Trong chương này, chúng tôi nâng cao độ sáng của hình ảnh bằng cách nhân mỗi pixel của hình ảnh với một giá trị alpha và thêm một giá trị beta khác vào đó.
Chúng tôi OpenCV chức năng convertTođiều đó thực hiện các hoạt động trên một cách tự động. Nó có thể được tìm thấy dướiMatgói hàng. Cú pháp của nó được đưa ra dưới đây:
int alpha = 2;
int beta = 50;
sourceImage.convertTo(destination, rtype , alpha, beta);
Các thông số được mô tả bên dưới:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | destination Nó là hình ảnh đích. |
2 | rtype Đó là loại ma trận đầu ra mong muốn hoặc đúng hơn là độ sâu, vì số lượng kênh giống như đầu vào có. nếu rtype là âm, ma trận đầu ra sẽ có cùng loại với đầu vào. |
3 | alpha Nó là hệ số tỷ lệ tùy chọn. |
4 | beta Nó là delta tùy chọn được thêm vào các giá trị được chia tỷ lệ. |
Ngoài phương thức convertTo, còn có các phương thức khác được cung cấp bởi lớp Mat. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | adjustROI(int dtop, int dbottom, int dleft, int dright) Nó điều chỉnh kích thước và vị trí của submatrix trong ma trận mẹ. |
2 | copyTo(Mat m) Nó sao chép ma trận sang một ma trận khác. |
3 | diag() Nó trích xuất một đường chéo từ ma trận hoặc tạo ma trận đường chéo. |
4 | dot(Mat m) Nó tính tích một chấm của hai vectơ. |
5 | reshape(int cn) Nó thay đổi hình dạng và / hoặc số lượng kênh của ma trận 2D mà không cần sao chép dữ liệu. |
6 | submat(Range rowRange, Range colRange) Nó trích xuất một ma trận con hình chữ nhật. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Mat để tăng cường độ sáng của hình ảnh:
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh sáng nâng cao (Alpha = 1 & Beta = 50)
Hình ảnh sáng nâng cao (Alpha = 2 & Beta = 50)
Trong chương này, chúng ta học cách tăng độ sắc nét của ảnh bằng bộ lọc Gaussian.
Đầu tiên chúng tôi sử dụng OpenCV chức năng GaussianBlur. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
Imgproc.GaussianBlur(source, destination, new Size(0,0), sigmaX);
Các thông số được mô tả ngắn gọn -
Sr.No. | Mô tả về Thông Số |
---|---|
1 | source Nó là hình ảnh nguồn. |
2 | destination Nó là hình ảnh đích. |
3 | Size Đó là kích thước hạt nhân Gaussian. |
4 | sigmaX Nó là độ lệch chuẩn của hạt nhân Gaussian theo hướng X. |
Hơn nữa, chúng tôi sử dụng OpenCV chức năng addWeightedđể áp dụng hình mờ hình ảnh cho hình ảnh. Nó có thể được tìm thấy dướiCoregói hàng. Cú pháp của nó được đưa ra dưới đây:
Core.addWeighted(InputArray src1, alpha, src2, beta, gamma, OutputArray dst);
Các tham số của hàm này được mô tả dưới đây:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | src1 Nó là mảng đầu vào đầu tiên. |
2 | alpha Nó là trọng số của các phần tử mảng đầu tiên. |
3 | src2 Đây là mảng đầu vào thứ hai có cùng kích thước và số kênh như src1. |
4 | Beta Nó là trọng số của các phần tử mảng thứ hai. |
5 | gamma Nó là vô hướng được thêm vào mỗi tổng. |
6 | dst Nó là mảng đầu ra có cùng kích thước và số kênh như mảng đầu vào. |
Ngoài phương thức GaussianBlur, còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc và Core để áp dụng độ sắc nét cho hình ảnh:
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) {
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh sắc nét
Một hình ảnh có thể dễ dàng được nén và lưu trữ thông qua Java. Nén hình ảnh liên quan đến việc chuyển đổi hình ảnh thành jpg và lưu trữ nó.
Để nén ảnh, chúng tôi đọc ảnh và chuyển đổi thành đối tượng BufferedImage.
Hơn nữa, chúng tôi nhận được ImageWriter từ getImageWritersByFormatName()phương thức được tìm thấy trong lớp ImageIO. Từ ImageWriter này, tạo mộtImageWriteParamvật. Cú pháp của nó được đưa ra dưới đây:
Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();
Từ đối tượng ImageWriteParam này, bạn có thể đặt nén bằng cách gọi hai phương thức này là setCompressionMode() và setCompressionQuality(). Các cú pháp của chúng như được đưa ra dưới đây:
obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);
Phương thức setCompressionMode () lấy Mode_EXPLICIT làm tham số. Một số CHẾ ĐỘ khác được mô tả ngắn gọn -
Sr.No. | Các chế độ |
---|---|
1 | MODE_DEFAULT Nó là một giá trị không đổi có thể được chuyển vào các phương thức để kích hoạt tính năng đó cho các lần ghi sau này. |
2 | MODE_DISABLED Nó là một giá trị không đổi có thể được chuyển vào các phương thức để tắt tính năng đó cho các lần ghi sau này. |
3 | MODE_EXPLICIT Nó là một giá trị không đổi có thể được chuyển vào các phương thức để kích hoạt tính năng đó cho các lần ghi sau này. |
Ngoài các phương thức nén, còn có các phương thức khác được cung cấp bởi lớp ImageWriteParam. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | canOffsetTiles() Nó trả về true nếu người viết có thể thực hiện lát gạch với các hiệu số lưới khác 0 trong khi viết. |
2 | getBitRate(float quality) Nó trả về một số nổi cho biết ước tính số lượng bit dữ liệu đầu ra cho mỗi bit dữ liệu hình ảnh đầu vào ở mức chất lượng nhất định. |
3 | getLocale() Nó trả về Ngôn ngữ được đặt hiện tại hoặc null nếu chỉ một Ngôn ngữ mặc định được hỗ trợ. |
4 | isCompressionLossless() Nó trả về true nếu kiểu nén hiện tại cung cấp tính năng nén không mất dữ liệu. |
5 | unsetCompression() Nó loại bỏ mọi cài đặt chất lượng và kiểu nén trước đó. |
6 | unsetTiling() Nó loại bỏ bất kỳ tham số lưới ô vuông nào trước đó được chỉ định bởi các cuộc gọi đến setTiling. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp ImageWriteParam để nén ảnh:
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();
}
}
Đầu ra
Khi bạn thực thi mã đã cho, nó sẽ nén hình ảnh digital_image_processing.jpg vào hình ảnh nén tương đương của nó và ghi nó vào đĩa cứng với tên compress.jpg.
Ảnh gốc
Hình ảnh nén - Hệ số chất lượng - 0,05
Hình ảnh nén - Hệ số chất lượng - 0,5
Trong chương này, chúng ta học cách thêm các loại đường viền khác nhau vào hình ảnh.
Chúng tôi sử dụng OpenCV chức năng copyMakeBorder. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
Imgproc.copyMakeBorder(source,destination,top,bottom,left,right,borderType);
Các thông số được mô tả bên dưới:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | source Nó là hình ảnh nguồn. |
2 | destination Nó là hình ảnh đích. |
3 | top Nó là chiều dài tính bằng pixel của đường viền ở đầu hình ảnh. |
4 | bottom Chiều dài tính bằng pixel của đường viền ở cuối hình ảnh. |
5 | left Nó là chiều dài tính bằng pixel của đường viền ở bên trái hình ảnh. |
6 | right Nó là chiều dài tính bằng pixel của đường viền ở bên phải hình ảnh. |
7 | borderType Nó xác định loại đường viền. Các đường viền có thể có là BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_CONSTANT, v.v. |
Ngoài phương thức copyMakeBorder (), còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để thêm đường viền vào hình ảnh:
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh đường viền cô lập
Hình ảnh đường viền được bọc
Phản chiếu hình ảnh đường viền
Hình ảnh kim tự tháp không có gì khác ngoài một phương pháp để hiển thị một hình ảnh đa độ phân giải. Lớp dưới cùng là phiên bản hình ảnh có độ phân giải cao nhất và lớp trên cùng là phiên bản hình ảnh có độ phân giải thấp nhất. Kim tự tháp hình ảnh được sử dụng để xử lý hình ảnh ở các tỷ lệ khác nhau.
Trong chương này, chúng tôi thực hiện một số lấy mẫu xuống và lấy mẫu lên trên hình ảnh.
Chúng tôi sử dụng OpenCV chức năng pyrUp và pyrDown. Chúng có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
Imgproc.pyrUp(source, destination, destinationSize);
Imgproc.pyrDown(source, destination,destinationSize);
Các thông số được mô tả bên dưới:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | source Nó là hình ảnh nguồn. |
2 | destination Nó là hình ảnh đích. |
3 | destinationSize Nó là kích thước của hình ảnh đầu ra. Theo mặc định, nó được tính là Size ((src.cols * 2), (src.rows * 2)). |
Ngoài các phương thức pyrUp và pyrDown, còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để thực hiện lấy mẫu lên và lấy mẫu xuống trên một hình ảnh.
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Trên hình ảnh gốc, pyrUp (Lấy mẫu LÊN) và pyrDown (Lấy mẫu Xuống) được thực hiện. Đầu ra sau khi lấy mẫu như hình dưới đây -
Hình ảnh PyrUP
Hình ảnh pyrDown
Định mức cho phép phân đoạn hình ảnh một cách dễ dàng nhất. Phân đoạn hình ảnh có nghĩa là chia hình ảnh hoàn chỉnh thành một tập hợp các pixel theo cách sao cho các pixel trong mỗi tập hợp có một số đặc điểm chung. Phân đoạn hình ảnh rất hữu ích trong việc xác định các đối tượng và ranh giới của chúng.
Trong chương này chúng ta thực hiện một số thao tác tạo ngưỡng cơ bản trên ảnh.
Chúng tôi sử dụng OpenCV chức năng threshold. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
Imgproc.threshold(source, destination, thresh , maxval , type);
Các thông số được mô tả bên dưới:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | source Nó là hình ảnh nguồn. |
2 | destination Nó là hình ảnh đích. |
3 | thresh Nó là giá trị ngưỡng. |
4 | maxval Đây là giá trị tối đa được sử dụng với các loại ngưỡng THRESH_BINARY và THRESH_BINARY_INV. |
5 | type Các loại có thể có là THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC và THRESH_TOZERO. |
Ngoài các phương thức tạo ngưỡng này, còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để thực hiện các hoạt động ngưỡng đối với một hình ảnh:
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Trên hình ảnh gốc ở trên, một số hoạt động ngưỡng được thực hiện được hiển thị trong đầu ra bên dưới:
Thresh Binary
Thresh Binary Invert
Thresh Zero
Hình dạng của hình ảnh có thể dễ dàng thay đổi bằng cách sử dụng OpenCV. Hình ảnh có thể được lật, chia tỷ lệ hoặc xoay theo bất kỳ hướng nào trong bốn hướng.
Để thay đổi hình dạng của ảnh, ta đọc ảnh và chuyển thành đối tượng Mat. Cú pháp của nó được đưa ra dưới đây:
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
Lật hình ảnh
OpenCV cho phép ba loại mã lật được mô tả bên dưới:
Sr.No. | Mã lật & mô tả |
---|---|
1 | 0 0 có nghĩa là, quay quanh trục x. |
2 | 1 1 có nghĩa là, quay quanh trục y. |
3 | -1 -1 nghĩa là quay quanh cả hai trục. |
Chúng tôi chuyển mã lật thích hợp vào phương thức flip() bên trong Corelớp học. Cú pháp của nó được đưa ra dưới đây:
Core.flip(source mat, destination mat1, flip_code);
Phương pháp flip() lấy ba tham số - ma trận ảnh nguồn, ma trận ảnh đích và mã lật.
Ngoài phương thức lật, còn có các phương thức khác được cung cấp bởi lớp Core. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | add(Mat src1, Mat src2, Mat dst) Nó tính tổng mỗi phần tử của hai mảng hoặc một mảng và một đại lượng vô hướng. |
2 | bitwise_and(Mat src1, Mat src2, Mat dst) Nó tính toán sự kết hợp khôn ngoan trên từng phần tử của hai mảng hoặc một mảng và một đại lượng vô hướng. |
3 | bitwise_not(Mat src, Mat dst) Nó đảo ngược từng bit của một mảng. |
4 | circle(Mat img, Point center, int radius, Scalar color) Nó vẽ một vòng tròn. |
5 | sumElems(Mat src) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | subtract(Mat src1, Scalar src2, Mat dst, Mat mask) Nó tính toán sự khác biệt trên mỗi phần tử giữa hai mảng hoặc mảng và một đại lượng vô hướng. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Core để lật một hình ảnh:
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());
}
}
}
Đầu ra
Khi bạn chạy ví dụ trên, nó sẽ lật tên hình ảnh digital_image_processing.jpg vào hình ảnh không gian màu HSV tương đương của nó và ghi nó vào đĩa cứng với tên flip.jpg.
Ảnh gốc
Hình ảnh đã lật
Trong chương này, chúng tôi áp dụng bộ lọc Gaussian cho một hình ảnh làm mờ một hình ảnh. Chúng ta sẽ sử dụng hàm GaussianBlur của OpenCV để áp dụng bộ lọc Gaussian cho hình ảnh. Nó có thể được tìm thấy trong gói Imgproc. Cú pháp của nó được đưa ra dưới đây:
Imgproc.GaussianBlur(source, destination,Size,SigmaX);
Các đối số của hàm được mô tả bên dưới:
Sr.No. | Lập luận & Mô tả |
---|---|
1 | source Nó là hình ảnh nguồn. |
2 | destination Nó là hình ảnh đích. |
3 | Size Đó là kích thước hạt nhân Gaussian. |
4 | SigmaX Nó là độ lệch chuẩn của hạt nhân Gaussian theo hướng X. |
Ngoài phương thức GaussianBlur, còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để áp dụng bộ lọc Gaussian cho một hình ảnh.
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Khi hình ảnh gốc này được đối chiếu với bộ lọc Gaussian có kích thước 11 và 45, kết quả sau sẽ được nhìn thấy.
Bộ lọc Gaussian có kích thước 11
Bộ lọc Gaussian cỡ 45
Chúng tôi áp dụng bộ lọc Hộp làm mờ hình ảnh. Bộ lọc Hộp có thể có kích thước 3x3, 5x5, 9x9, v.v.
Chúng tôi sử dụng OpenCV chức năng filter2Dđể áp dụng bộ lọc Hộp cho hình ảnh. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Các đối số của hàm được mô tả bên dưới:
Sr.No. | Lập luận & Mô tả |
---|---|
1 | src Nó là hình ảnh nguồn. |
2 | dst Nó là hình ảnh đích. |
3 | depth Nó là độ sâu của dst. Giá trị âm (chẳng hạn như -1) chỉ ra rằng độ sâu giống với nguồn. |
4 | kernel Nó là hạt nhân được quét qua ảnh. |
5 | anchor Nó là vị trí của neo so với nhân của nó. Vị trí Điểm (-1, -1) cho biết trung tâm theo mặc định. |
6 | delta Nó là một giá trị được thêm vào mỗi pixel trong quá trình tích chập. Theo mặc định, nó là 0. |
7 | BORDER_DEFAULT Chúng tôi để giá trị này theo mặc định. |
Ngoài phương thức filter2D (), còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để áp dụng bộ lọc Hộp cho hình ảnh có Thang độ xám.
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Trong ví dụ này, chúng ta chuyển đổi hình ảnh của mình với bộ lọc (nhân) sau. Bộ lọc này dẫn đến làm mờ hình ảnh khi kích thước của nó tăng lên.
Hình ảnh gốc này đã được xử lý với bộ lọc hộp có kích thước 5, được đưa ra bên dưới -
Bộ lọc hộp cỡ 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 |
Hình ảnh được chuyển đổi (với Bộ lọc hộp có kích thước 5)
Hình ảnh được chuyển đổi (với Bộ lọc hộp có kích thước 9)
Trong chương này, chúng ta học áp dụng hai toán tử hình thái học rất phổ biến: Độ giãn nở và Xói mòn.
Chúng tôi sử dụng OpenCV chức năng erode và dilate. Chúng có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
Imgproc.erode(source, destination, element);
Imgproc.dilate(source, destination, element);
Các thông số được mô tả bên dưới:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | source Nó là hình ảnh Nguồn. |
2 | destination Nó là hình ảnh đích. |
3 | element Nó là một phần tử cấu trúc được sử dụng để xói mòn và giãn nở, nếu phần tử = Mat (), một phần tử có cấu trúc hình chữ nhật 3 x 3 được sử dụng. |
Ngoài các phương thức erode () và dilate (), còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để thực hiện xói mòn và giãn nở trên hình ảnh:
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Trên hình ảnh gốc ở trên, một số hoạt động xói mòn và giãn nở đã được thực hiện, được hiển thị trong kết quả bên dưới -
Xói mòn
Sự giãn nở
Trong chương này, chúng ta tìm hiểu hai cách áp dụng hình mờ trên hình ảnh. Những cách này là -
- Áp dụng hình mờ văn bản
- Áp dụng hình mờ hình ảnh
Áp dụng hình mờ văn bản
Chúng tôi sử dụng OpenCV chức năng putTextđể áp dụng hình mờ văn bản cho hình ảnh. Nó có thể được tìm thấy dướiCoregói hàng. Cú pháp của nó được đưa ra dưới đây:
Core.putText(source, Text, Point, fontFace ,fontScale , color);
Các tham số của hàm này được mô tả dưới đây:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | Source Nó là hình ảnh nguồn. |
2 | Text Đây là văn bản chuỗi sẽ xuất hiện trên hình ảnh. |
3 | Point Đây là điểm mà văn bản sẽ xuất hiện trên hình ảnh. |
4 | fontFace Loại phông chữ. Ví dụ - FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX, v.v. |
5 | fontScale Nó là hệ số tỷ lệ phông chữ được nhân với kích thước cơ bản cụ thể của phông chữ. |
6 | color Nó là màu văn bản. |
Ngoài phương thức putText, còn có các phương thức khác được cung cấp bởi lớp Core. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | normalize(Mat src, Mat dst, double alpha, double beta, int norm_type) Nó chuẩn hóa phạm vi chuẩn hoặc giá trị của một mảng. |
2 | perspectiveTransform(Mat src, Mat dst, Mat m) Nó thực hiện phép biến đổi ma trận phối cảnh của các vectơ. |
3 | phase(Mat x, Mat y, Mat angle) Nó tính toán góc quay của vectơ 2D. |
4 | rectangle(Mat img, Point pt1, Point pt2, Scalar color) Nó vẽ một hình chữ nhật đơn giản, dày hoặc đầy. |
5 | reduce(Mat src, Mat dst, int dim, int rtype, int dtype) Nó giảm ma trận thành một vector. |
6 | transform(Mat src, Mat dst, Mat m) Nó thực hiện phép biến đổi ma trận của mọi phần tử mảng. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Core để áp dụng hình mờ văn bản cho hình ảnh:
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Văn bản Hình mờ
Áp dụng Hình mờ Hình ảnh trên Hình ảnh
Chúng tôi sẽ sử dụng OpenCV chức năng addWeightedđể áp dụng hình mờ hình ảnh cho hình ảnh. Nó có thể được tìm thấy dướiCoregói hàng. Cú pháp của nó được đưa ra dưới đây:
Core.addWeighted(InputArray src1, alpha, src2 (Watermark image), beta, gamma, OutputArray dst);
Các tham số của hàm này được mô tả dưới đây:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | src1 Nó là mảng đầu vào đầu tiên. |
2 | alpha Nó là trọng số của các phần tử mảng đầu tiên. |
3 | src2 Đây là mảng đầu vào thứ hai có cùng kích thước và số kênh như src1. |
4 | beta Nó là trọng số của các phần tử mảng thứ hai. |
5 | gamma Nó là vô hướng được thêm vào mỗi tổng. |
6 | dst Nó là mảng đầu ra có cùng kích thước và số kênh như mảng đầu vào. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Core để áp dụng hình mờ hình ảnh cho hình ảnh:
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình mờ
Hình ảnh Watermarked
Tích phân là một phép toán trên hai hàm f và g. Hàm f và g trong trường hợp này là ảnh, vì ảnh cũng là hàm hai chiều.
Thực hiện chuyển đổi
Để thực hiện tích chập trên một hình ảnh, các bước sau được thực hiện:
- Chỉ lật mặt nạ (theo chiều ngang và chiều dọc) một lần.
- Trượt mặt nạ vào hình ảnh.
- Nhân các phần tử tương ứng và sau đó cộng chúng.
- Lặp lại quy trình này cho đến khi tất cả các giá trị của hình ảnh đã được tính toán.
Chúng tôi sử dụng OpenCV chức năng filter2Dđể áp dụng tích chập cho hình ảnh. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Các đối số của hàm được mô tả bên dưới:
Sr.No. | Lập luận & Mô tả |
---|---|
1 | src Nó là hình ảnh nguồn. |
2 | dst Nó là hình ảnh đích. |
3 | depth Nó là độ sâu của dst. Giá trị âm (chẳng hạn như -1) chỉ ra rằng độ sâu giống với nguồn. |
4 | kernel Nó là hạt nhân được quét qua ảnh. |
5 | anchor Nó là vị trí của neo so với nhân của nó. Vị trí Điểm (-1, -1) cho biết trung tâm theo mặc định. |
6 | delta Nó là một giá trị được thêm vào mỗi pixel trong quá trình tích chập. Theo mặc định, nó là 0. |
7 | BORDER_DEFAULT Chúng tôi để giá trị này theo mặc định. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để thực hiện phép tích chập trên hình ảnh của Thang độ xám.
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());
}
}
}
Đầu ra
Trong ví dụ này, chúng ta chuyển đổi hình ảnh của mình với bộ lọc (nhân) sau. Bộ lọc này tạo ra hình ảnh gốc như nó vốn có -
0 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
Ảnh gốc
Hình ảnh được chuyển đổi
Toán tử Prewitt được sử dụng để phát hiện cạnh trong ảnh. Nó phát hiện hai loại cạnh: cạnh dọc và cạnh ngang.
Chúng tôi sử dụng OpenCV chức năng filter2Dđể áp dụng toán tử Prewitt cho hình ảnh. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Các đối số của hàm được mô tả bên dưới:
Sr.No. | Lập luận & Mô tả |
---|---|
1 | src Nó là hình ảnh nguồn. |
2 | dst Nó là hình ảnh đích. |
3 | depth Nó là độ sâu của dst. Giá trị âm (chẳng hạn như -1) chỉ ra rằng độ sâu giống với nguồn. |
4 | kernel Nó là hạt nhân được quét qua ảnh. |
5 | anchor Nó là vị trí của neo so với nhân của nó. Vị trí Điểm (-1, -1) cho biết trung tâm theo mặc định. |
6 | delta Nó là một giá trị được thêm vào mỗi pixel trong quá trình tích chập. Theo mặc định, nó là 0. |
7 | BORDER_DEFAULT Chúng tôi để giá trị này theo mặc định. |
Ngoài phương thức filter2D, còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để áp dụng toán tử Prewitt cho hình ảnh của Thang độ xám.
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh gốc này được đối chiếu với toán tử Prewitt của các cạnh dọc như được đưa ra bên dưới:
Hướng dọc
-1 | 0 | 1 |
-1 | 0 | 1 |
-1 | 0 | 1 |
Hình ảnh được chuyển đổi (Hướng dọc)
Hình ảnh gốc này cũng đã được đối chiếu với toán tử Prewitt của các cạnh ngang, được đưa ra bên dưới:
Hướng ngang
-1 | -1 | -1 |
0 | 0 | 0 |
1 | 1 | 1 |
Hình ảnh được chuyển đổi (Hướng ngang)
Toán tử Sobel rất giống với toán tử Prewitt. Nó cũng là một mặt nạ phái sinh và được sử dụng để phát hiện cạnh. Toán tử Sobel được sử dụng để phát hiện hai loại cạnh trong hình ảnh: Các cạnh hướng dọc và các cạnh hướng ngang.
Chúng tôi sẽ sử dụng OpenCV chức năng filter2Dđể áp dụng toán tử Sobel cho hình ảnh. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Các đối số của hàm được mô tả bên dưới:
Sr.No. | Tranh luận |
---|---|
1 | src Nó là hình ảnh nguồn. |
2 | dst Nó là hình ảnh đích. |
3 | depth Nó là độ sâu của dst. Giá trị âm (chẳng hạn như -1) chỉ ra rằng độ sâu giống với nguồn. |
4 | kernel Nó là hạt nhân được quét qua ảnh. |
5 | anchor Nó là vị trí của neo so với nhân của nó. Vị trí Điểm (-1, -1) cho biết trung tâm theo mặc định. |
6 | delta Nó là một giá trị được thêm vào mỗi pixel trong quá trình tích chập. Theo mặc định, nó là 0. |
7 | BORDER_DEFAULT Chúng tôi để giá trị này theo mặc định. |
Ngoài phương thức filter2D, còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để áp dụng toán tử Sobel cho hình ảnh của Thang độ xám.
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh gốc này được đối chiếu với toán tử Sobel của các cạnh dọc, được đưa ra bên dưới:
Hướng dọc
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
Hình ảnh được chuyển đổi (Hướng dọc)
Bản gốc này được biến đổi với toán tử Sobel của các cạnh ngang, được đưa ra bên dưới:
Hướng ngang
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
Hình ảnh được chuyển đổi (Hướng ngang)
Mặt nạ la bàn Kirsch là một loại mặt nạ phái sinh khác được sử dụng để phát hiện cạnh. Toán tử này còn được gọi là mặt nạ định hướng. Trong toán tử này, chúng tôi lấy một mặt nạ và xoay nó theo tất cả tám hướng la bàn để có được các cạnh của tám hướng.
Chúng tôi sẽ sử dụng OpenCV chức năng filter2Dđể áp dụng toán tử Kirsch cho hình ảnh. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Các đối số của hàm được mô tả bên dưới:
Sr.No. | Tranh luận |
---|---|
1 | src Nó là hình ảnh nguồn. |
2 | dst Nó là hình ảnh đích. |
3 | depth Nó là độ sâu của dst. Giá trị âm (chẳng hạn như -1) chỉ ra rằng độ sâu giống với nguồn. |
4 | kernel Nó là hạt nhân được quét qua ảnh. |
5 | anchor Nó là vị trí của neo so với nhân của nó. Vị trí Điểm (-1, -1) cho biết trung tâm theo mặc định. |
6 | delta Nó là một giá trị được thêm vào mỗi pixel trong quá trình tích chập. Theo mặc định, nó là 0. |
7 | BORDER_DEFAULT Chúng tôi để giá trị này theo mặc định. |
Ngoài phương thức filter2D (), còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để áp dụng toán tử Kirsch cho hình ảnh của Thang độ xám.
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh gốc này được đối chiếu với toán tử Kirsch của các cạnh Đông, như được đưa ra bên dưới -
Kirsch East
-3 | -3 | -3 |
-3 | 0 | -3 |
5 | 5 | 5 |
Hình ảnh được chuyển đổi (Kirsch East)
Hình ảnh gốc này được đối chiếu với toán tử Kirsch của các cạnh Tây Nam, như được đưa ra bên dưới -
Kirsch Tây Nam
5 | 5 | -3 |
5 | 0 | -3 |
-3 | -3 | -3 |
Hình ảnh được chuyển đổi (Kirsch South West)
Mặt nạ la bàn Robinson là một loại mặt nạ phái sinh khác được sử dụng để phát hiện cạnh. Toán tử này còn được gọi là mặt nạ định hướng. Trong toán tử này, chúng ta lấy một mặt nạ và xoay nó theo tất cả tám hướng chính để có được các cạnh của tám hướng.
Chúng tôi sẽ sử dụng OpenCV chức năng filter2Dđể áp dụng toán tử Robinson cho hình ảnh. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Các đối số của hàm được mô tả bên dưới:
Sr.No. | Lập luận & Mô tả |
---|---|
1 | src Nó là hình ảnh nguồn. |
2 | dst Nó là hình ảnh đích. |
3 | depth Nó là độ sâu của dst. Giá trị âm (chẳng hạn như -1) chỉ ra rằng độ sâu giống với nguồn. |
4 | kernel Nó là hạt nhân được quét qua ảnh. |
5 | anchor Nó là vị trí của neo so với nhân của nó. Vị trí Điểm (-1, -1) cho biết trung tâm theo mặc định. |
6 | delta Nó là một giá trị được thêm vào mỗi pixel trong quá trình tích chập. Theo mặc định, nó là 0. |
7 | BORDER_DEFAULT Chúng tôi để giá trị này theo mặc định. |
Ngoài phương thức filter2D, còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để áp dụng toán tử Robinson cho hình ảnh của Thang độ xám.
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh gốc này được đối chiếu với toán tử Robinson của các cạnh Bắc như được đưa ra bên dưới:
Mặt nạ hướng Bắc
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
Convolved Image(Robinson North)
This original image has also been convolved with the Robinson operator of East edges as given below −
East Direction Mask
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
Convolved Image(Robinson East)
Laplacian Operator is also a derivative operator which is used to find edges in an image. The major difference between Laplacian and other operators like Prewitt, Sobel, Robinson, and Kirsch is that these all are first order derivative masks but Laplacian is a second order derivative mask.
We use OpenCV function filter2D to apply Laplacian operator to images. It can be found under Imgproc package. Its syntax is given below −
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
The function arguments are described below −
Sr.No. | Arguments |
---|---|
1 | src It is source image. |
2 | dst It is destination image. |
3 | depth It is the depth of dst. A negative value (such as -1) indicates that the depth is the same as the source. |
4 | kernel It is the kernel to be scanned through the image. |
5 | anchor It is the position of the anchor relative to its kernel. The location Point (-1, -1) indicates the center by default. |
6 | delta It is a value to be added to each pixel during the convolution. By default it is 0. |
7 | BORDER_DEFAULT We let this value by default. |
Apart from the filter2D() method, there are other methods provided by the Imgproc class. They are described briefly −
Sr.No. | Method & Description |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) It converts an image from one color space to another. |
2 | dilate(Mat src, Mat dst, Mat kernel) It dilates an image by using a specific structuring element. |
3 | equalizeHist(Mat src, Mat dst) It equalizes the histogram of a grayscale image. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) It convolves an image with the kernel. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) It blurs an image using a Gaussian filter. |
6 | integral(Mat src, Mat sum) It calculates the integral of an image. |
Example
The following example demonstrates the use of Imgproc class to apply Laplacian operator to an image of Grayscale.
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());
}
}
}
Output
When you execute the given code, the following output is seen −
Original Image
This original image is convolved with the Laplacian Negative operator as given below −
Laplacian Negative
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Convolved Image(Laplacian Negative)
This original image is convolved with the Laplacian Positive operator as given below −
Laplacian Positive
0 | 1 | 0 |
1 | -4 | 1 |
0 | 1 | 0 |
Convolved Image (Laplacian Positive)
In weighted average filter, we gave more weight to the center value, due to which the contribution of center becomes more than the rest of the values. Due to weighted average filtering, we can control the blurring of image.
We use OpenCV function filter2D to apply weighted average filter to images. It can be found under Imgproc package. Its syntax is given below −
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
The function arguments are described below −
Sr.No. | Argument & Description |
---|---|
1 | src It is source image. |
2 | dst It is destination image. |
3 | ddepth It is the depth of dst. A negative value (such as -1) indicates that the depth is the same as the source. |
4 | kernel It is the kernel to be scanned through the image. |
5 | anchor It is the position of the anchor relative to its kernel. The location Point(-1, -1) indicates the center by default. |
6 | delta It is a value to be added to each pixel during the convolution. By default it is 0. |
7 | BORDER_DEFAULT We let this value by default. |
Apart from the filter2D() method, there are other methods provide by the Imgproc class. They are described briefly −
Sr.No. | Method & Description |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) It converts an image from one color space to another. |
2 | dilate(Mat src, Mat dst, Mat kernel) It dilates an image by using a specific structuring element. |
3 | equalizeHist(Mat src, Mat dst) It equalizes the histogram of a grayscale image. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) It convolves an image with the kernel. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) It blurs an image using a Gaussian filter. |
6 | integral(Mat src, Mat sum) It calculates the integral of an image. |
Example
The following example demonstrates the use of Imgproc class to apply weighted average filter to an image of 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());
}
}
}
Output
When you execute the given code, the following output is seen −
Original Image
This original image is convolved with the weighted average filter as given below −
Weighted Average Filter
1 | 1 | 1 |
1 | 10 | 1 |
1 | 1 | 1 |
Convolved Image
Zooming is the process of enlarging an image so that the details in the image become more visible and prominent.
We use OpenCV function resize to apply zooming to images. It can be found under Imgproc package. Its syntax is given below −
Imgproc.resize(source,destination, destination.size(),zoomFactor,zoomFactor,Interpolation);
In the resize function, we pass source image, destination image and its size, zooming factor, and the interpolation method to use.
The interpolation methods available are described below −
Sr.No. | Interpolation method & Description |
---|---|
1 | INTER_NEAREST It is nearest-neighbour interpolation. |
2 | INTER_LINEAR It is bilinear interpolation (used by default). |
3 | INTER_AREA It is resampling using pixel area relation. It may be a preferred method for image decimation, as it gives more-free results. |
4 | INTER_CUBIC It is a bi-cubic interpolation over 4x4 pixel neighbourhood. |
5 | INTER_LANCZOS4 It is a Lanczos interpolation over 8x8 pixel neighbourhood. |
Apart from the resize method, there are other methods provided by the Imgproc class. They are described briefly −
Sr.No. | Method & Description |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) It converts an image from one color space to another. |
2 | dilate(Mat src, Mat dst, Mat kernel) It dilates an image by using a specific structuring element. |
3 | equalizeHist(Mat src, Mat dst) It equalizes the histogram of a grayscale image. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) It convolves an image with the kernel. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) It blurs an image using a Gaussian filter. |
6 | integral(Mat src, Mat sum) It calculates the integral of an image. |
Example
The following example demonstrates the use of Imgproc class to apply zooming to an image.
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());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Hình ảnh được Thu phóng (Hệ số thu phóng - 2)
Trong chương này, chúng ta cùng tìm hiểu một số thư viện xử lý ảnh miễn phí được sử dụng rộng rãi và có thể dễ dàng tích hợp trong dự án. Các thư viện này bao gồm -
- ImageJ
- Fiji
- Hình ảnh Commons
- ImageMagick
- Endrov
- LeadTools
- OpenCv
ImageJ
ImageJ là một chương trình xử lý hình ảnh Java miền công cộng được lấy cảm hứng từ NIH Image cho Macintosh. Nó có thể hiển thị, chỉnh sửa, phân tích, xử lý, lưu và in hình ảnh 8 bit, 16 bit và 32 bit.
Một số tính năng cơ bản của ImageJ được mô tả dưới đây:
Sr.No. | Sự miêu tả yếu tố |
---|---|
1 | Runs Everywhere ImageJ được viết bằng Java, cho phép nó chạy trên Linux, Mac OS X và Windows, ở cả chế độ 32 bit và 64 bit. |
2 | Open Source ImageJ và mã nguồn Java của nó có sẵn miễn phí và trong miền công cộng. |
3 | Toolkit Sử dụng ImageJ như một bộ công cụ xử lý hình ảnh (thư viện lớp) để phát triển các applet, servlet hoặc các ứng dụng. |
4 | Data Types Thang màu xám 8 bit hoặc màu được lập chỉ mục, số nguyên 16 bit không dấu, dấu phẩy động 32 bit và màu RGB. |
5 | File Formats Mở và lưu GIF, JPEG, BMP, PNG, PGM, FITS và ASCII. Mở DICOM. Mở TIFF, GIF, JPEG, DICOM và dữ liệu thô bằng URL. |
6 | Selections Tạo vùng chọn hình chữ nhật, hình elip hoặc không đều. Tạo các lựa chọn đường và điểm. |
7 | Image Enhancement Hỗ trợ làm mịn, làm sắc nét, phát hiện cạnh, lọc trung bình và tạo ngưỡng trên cả hình ảnh màu xám 8 bit và màu RGB. |
số 8 | Color Processing Chia hình ảnh màu 32 bit thành các thành phần RGB hoặc HSV. Hợp nhất các thành phần 8-bit thành một hình ảnh màu. |
Fiji
Fiji là một gói xử lý hình ảnh. Nó có thể được mô tả như một bản phân phối của ImageJ (và ImageJ2) cùng với Java, Java3D và rất nhiều plug-in được tổ chức thành một cấu trúc menu nhất quán. Fiji so sánh với ImageJ vì Ubuntu so với Linux.
Ngoài các tính năng cơ bản của ImageJ, một số tính năng nâng cao của Fiji được mô tả bên dưới:
Sr.No. | Sự miêu tả yếu tố |
---|---|
1 | Registering 3D images Điều này liên quan đến việc căn chỉnh đàn hồi và chỉnh sửa, trích xuất tính năng, bộ ổn định hình ảnh, v.v. |
2 | Segmenting images Nó cung cấp hơn 35 loại phân đoạn. |
3 | Useful keyboard short cuts Fuji có rất nhiều phím tắt. |
4 | Scripting Cho phép tạo tập lệnh với Macro, trong JavaScript, JRuby, Jython, Clojure và Beanshell. |
5 | Developing Plug-ins Sử dụng Trình chỉnh sửa tập lệnh để bắt đầu phát triển các trình cắm và sau đó chạy các trình cắm thêm. |
6 | ImageJ Tricks ImageJ rất dễ sử dụng, nhưng đôi khi bạn muốn một số chức năng thực sự được triển khai, nhưng bạn không biết cách kích hoạt. |
Hình ảnh Commons
Apache Commons Imaging, trước đây được gọi là Apache Commons Sanselan, là một thư viện đọc và ghi nhiều định dạng hình ảnh khác nhau, bao gồm phân tích nhanh thông tin hình ảnh như (kích thước, màu sắc, không gian, hồ sơ ICC, v.v.) và dữ liệu meta.
Một số tính năng cơ bản của ImageJ được mô tả dưới đây:
Sr.No. | Sự miêu tả yếu tố |
---|---|
1 | Java Apache Commons Imaging được viết bằng Java thuần túy 100%. Nó thực thi trên mọi JVM và bất kỳ nền tảng nào mà không cần sửa đổi. |
2 | Image Formats Nó đọc và ghi nhiều định dạng hình ảnh, và hỗ trợ một số biến thể và mã hóa mà tất cả hoặc hầu hết các thư viện khác bỏ sót. |
3 | Metadata support Nó hỗ trợ đọc và ghi nhiều loại dữ liệu meta theo cách có cấu trúc, bao gồm cả dữ liệu meta EXIF. |
4 | Network Friendly Nó thân thiện với mạng. Commons Imaging chỉ đọc dữ liệu mà nó cần và lưu vào bộ nhớ cache những gì đã đọc để nó không quá nặng trên mạng. |
5 | Easy to use Nó được thiết kế để rất dễ sử dụng. Nó có một giao diện đơn giản, sạch sẽ. Hầu hết các hoạt động là một cuộc gọi phương thức Hình ảnh duy nhất. |
6 | Transparent Commons Imaging nhằm mục đích minh bạch. Không có bộ đệm ẩn để xử lý, không có bộ nhớ gốc để giải phóng, không có chuỗi nền. |
7 | Open Source Nó là Phần mềm miễn phí / Mã nguồn mở. Nó có sẵn theo Giấy phép Phần mềm Apache. |
số 8 | Color Conversions Lớp ColorConversions cung cấp các phương thức để chuyển đổi giữa các không gian màu sau - CIE-L * CH, CIE-L * ab, CIE-L * uv, CMY, CMYK, HSL, HSV, Hunter-Lab, RGB, XYZ và YXY. |
ImageMagick
ImageMagick là một bộ phần mềm để tạo, chỉnh sửa, soạn hoặc chuyển đổi hình ảnh bitmap. Nó có thể đọc và ghi hình ảnh ở hơn 100 định dạng bao gồm DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PNG, Postscript, SVG và TIFF. Sử dụng ImageMagick để thay đổi kích thước, lật, phản chiếu, xoay, bóp méo, cắt và biến đổi hình ảnh, điều chỉnh màu sắc hình ảnh, áp dụng các hiệu ứng đặc biệt khác nhau hoặc vẽ văn bản, đường thẳng, đa giác, hình elip và đường cong Bezier.
Một số tính năng cơ bản của ImageMagick được mô tả dưới đây:
Sr.No. | Sự miêu tả yếu tố |
---|---|
1 | Format conversion Nó chuyển đổi hình ảnh từ định dạng này sang định dạng khác (ví dụ: PNG sang JPEG). |
2 | Transform Nó có thể thay đổi kích thước, xoay, cắt, lật hoặc cắt một hình ảnh. |
3 | Transparency Nó làm ẩn các phần của một hình ảnh. |
4 | Draw Nó thêm hình dạng hoặc văn bản vào hình ảnh. |
5 | Decorate Nó thêm một đường viền hoặc khung cho hình ảnh. |
6 | Special effects Nó có thể làm mờ, làm sắc nét, ngưỡng hoặc tô màu cho hình ảnh. |
7 | Animation Nó có thể tạo chuỗi ảnh động GIF từ một nhóm hình ảnh. |
số 8 | Composite Nó có thể chồng lên một hình ảnh khác. |
9 | Morphology of shapes Nó trích xuất các tính năng, mô tả hình dạng và nhận dạng các mẫu trong hình ảnh. |
10 | Encipher or decipher an image Nó chuyển đổi hình ảnh bình thường thành vô nghĩa khó hiểu và quay lại một lần nữa. |
Endrov
Endrov là một chương trình phân tích hình ảnh đa mục đích. Nó được viết độc lập và được thiết kế để giải quyết nhiều thiếu sót của các phần mềm miễn phí khác và nhiều gói thương mại.
Một số tính năng cơ bản của Endrov được mô tả dưới đây:
Sr.No. | Sự miêu tả yếu tố |
---|---|
1 | View data Nó xem dữ liệu, ở dạng 2D và 3D. Được thiết kế để xử lý các lược đồ dữ liệu 4D phức tạp và số lượng kênh không giới hạn, trong đó mỗi kênh có thể có độ phân giải X, Y và Z riêng. |
2 | Annotate your images Nó chú thích hình ảnh của bạn, tự động hoặc bằng tay, để hiểu chúng và nhận số liệu thống kê. |
3 | Undo and Redo Nó có thể hoàn tác và làm lại cho tất cả các hoạt động. |
4 | Lazy Evaluation Nó được thiết kế từ mặt đất để xử lý các bộ ảnh lớn. Endrov sử dụng đánh giá lười biếng, một khái niệm hầu như chỉ có trong các ngôn ngữ lập trình nghiên cứu. |
5 | Scripting language Nó hỗ trợ ngôn ngữ kịch bản đồ họa, cũng như kịch bản truyền thống. |
6 | Java Được viết bằng Java. Kiến trúc trình cắm cho phép mở rộng dễ dàng với các trình cắm thêm Java mới. Nó có thể tương tác với Matlab. |
7 | Formats Nó truy cập hầu hết các định dạng tệp thương mại và mở sử dụng các định dạng Sinh học. |
số 8 | Microscopic Processing Nó có thể điều khiển tất cả các kính hiển vi của bạn bằng một chương trình và thực hiện phân tích hình ảnh nhanh chóng. |
LEADTOOLS
LEADTOOLS cung cấp hơn 200 chức năng xử lý hình ảnh trong một số danh mục bao gồm dọn dẹp tài liệu, nâng cao hình ảnh y tế, chuyển đổi và chỉnh sửa màu sắc, giảm nhiễu, phát hiện cạnh, v.v.
Một số tính năng cơ bản của LEADTOOLS được mô tả dưới đây:
Sr.No. | Sự miêu tả yếu tố |
---|---|
1 | Scanned Document Image Processing Bộ sưu tập chức năng mạnh mẽ này có thể đọc các tài liệu được quét về đồ tạo tác và các khuyết tật như lỗ đục lỗ, góc lệch, đường viền, đốm bụi, v.v. |
2 | Medical Image Processing Nâng cao hình ảnh hoặc làm nổi bật các chi tiết bằng cách dịch chuyển, chọn, trừ và xóa hậu cảnh để có hình ảnh đẹp hơn. |
3 | Geometric Transformation Các chức năng này có thể được sử dụng để làm sạch, căn chỉnh, chỉnh sửa hình ảnh hoặc áp dụng các hiệu ứng 3D nghệ thuật. |
4 | Brightness and Contrast Các chức năng này có thể được sử dụng để nâng cao hình ảnh, áp dụng hiệu ứng nghệ thuật hoặc hỗ trợ đánh giá chẩn đoán hình ảnh y tế. |
5 | Color Space Conversion Họ có thể thêm chức năng không gian màu hình ảnh cho các ứng dụng đơn và đa luồng bao gồm các ứng dụng được lưu trữ trên máy chủ IIS và Windows WF. |
6 | Color Correction Các chức năng này được sử dụng để hiệu chỉnh hình ảnh với các kênh màu được hoán đổi, cân bằng cường độ màu hoặc thực hiện các tác vụ phân tích hình ảnh khác nhau. |
7 | Image Enhancement Các chức năng này được sử dụng để sửa các lỗi phổ biến trong nhiếp ảnh như mắt đỏ và màu sắc không cân bằng cũng như hỗ trợ đánh giá chẩn đoán hình ảnh y tế. |
số 8 | Region of Interest Các chức năng này được sử dụng để tạo và sửa đổi các vùng quan tâm trong hình ảnh để thực hiện các chức năng xử lý hình ảnh trên các phần cụ thể của hình ảnh, tiết kiệm thời gian mã vạch và nhận dạng OCR hoặc thực hiện các tác vụ phân tích hình ảnh khác nhau. |
OpenCV
OpenCV được phát hành theo giấy phép BSD và do đó nó miễn phí cho cả mục đích học thuật và thương mại. Nó có các giao diện C ++, C, Python và Java và nó hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế cho hiệu quả tính toán và tập trung mạnh vào các ứng dụng thời gian thực. Được viết bằng C / C ++ được tối ưu hóa, thư viện có thể tận dụng lợi thế của quá trình xử lý đa lõi.
Một số tính năng cơ bản của OpenCV được mô tả ngắn gọn:
Sr.No. | Sự miêu tả yếu tố |
---|---|
1 | Smoothing Images Điều này liên quan đến việc áp dụng Blur, GaussianBlur, medianBlur và Bộ lọc song phương. |
2 | Eroding and Dilating Nó có thể áp dụng hai toán tử hình thái học rất phổ biến - Độ giãn nở và Xói mòn. |
3 | Morphology Transformations Hàm OpenCV morphologyEx để áp dụng Chuyển đổi hình thái như mở, đóng, TopHat và BlackHat, v.v. |
4 | Image Pyramids OpenCV có chức năng pyrUp và pyrDown để lấy mẫu xuống hoặc lấy mẫu một hình ảnh nhất định. |
4 | Basic Thresholding Operations Thực hiện các hoạt động tạo ngưỡng cơ bản bằng cách sử dụng ngưỡng chức năng OpenCV. |
5 | Adding borders to your images Chức năng OpenCV copyMakeBorder được sử dụng để đặt đường viền (thêm phần đệm cho hình ảnh của bạn). |
7 | Remapping Trong OpenCV, chức năng remap cung cấp một triển khai ánh xạ lại đơn giản. |
số 8 | Histogram Calculation Đối với các mục đích đơn giản, OpenCV triển khai hàm calcHist, hàm này tính toán biểu đồ của một tập hợp các mảng (thường là hình ảnh hoặc mặt phẳng hình ảnh). Nó có thể hoạt động với tối đa 32 chiều. |
OpenCV được phát hành theo giấy phép BSD và do đó nó miễn phí cho cả mục đích học thuật và thương mại. Nó có các giao diện C ++, C, Python và Java, và nó hỗ trợ Windows, Linux, Mac OS, iOS và Android.
OpenCV được thiết kế cho hiệu quả tính toán và tập trung mạnh vào các ứng dụng thời gian thực. Được viết bằng C / C ++ được tối ưu hóa, thư viện có thể tận dụng lợi thế của quá trình xử lý đa lõi.
Một số tính năng cơ bản của OpenCV được mô tả dưới đây:
Sr.No. | Sự miêu tả yếu tố |
---|---|
1 | Smoothing Images Điều này liên quan đến việc áp dụng Blur, GaussianBlur, medianBlur và Bộ lọc song phương. |
2 | Eroding and Dilating Nó có thể áp dụng hai toán tử hình thái học rất phổ biến - Độ giãn nở và Xói mòn. |
3 | Morphology Transformations Hàm OpenCV morphologyEx để áp dụng Chuyển đổi hình thái như mở, đóng, TopHat và BlackHat, v.v. |
4 | Image Pyramids OpenCV có chức năng pyrUp và pyrDown để lấy mẫu xuống hoặc lấy mẫu một hình ảnh nhất định. |
4 | Basic Thresholding Operations Nó có thể thực hiện các hoạt động tạo ngưỡng cơ bản bằng cách sử dụng ngưỡng chức năng OpenCV. |
5 | Adding borders to your images Chức năng OpenCV copyMakeBorder được sử dụng để đặt đường viền (thêm phần đệm cho hình ảnh của bạn). |
7 | Remapping Trong OpenCV, chức năng remap cung cấp một triển khai ánh xạ lại đơn giản. |
số 8 | Histogram Calculation Đối với các mục đích đơn giản, OpenCV triển khai hàm calcHist, hàm này tính toán biểu đồ của một tập hợp các mảng (thường là hình ảnh hoặc mặt phẳng hình ảnh). Nó có thể hoạt động với tối đa 32 chiều. |
Tích hợp OpenCV
Các bước sau giải thích cách tích hợp OpenCV vào các ứng dụng của bạn.
Tải xuống OpenCV
Bạn có thể tải xuống OpenCV từ Trang web chính thức của họ tại đây .
Tạo Thư viện Người dùng
Hơn nữa, chúng tôi tạo một thư viện người dùng của OpenCV để chúng tôi có thể sử dụng nó như một dự án trong tương lai.
Khởi chạy Eclipse
Chọn Cửa sổ -> Tùy chọn từ menu.
Điều hướng trong Java -> Đường dẫn xây dựng -> Thư viện người dùng và nhấp vào Mới.
Bây giờ hãy nhập tên cho thư viện của bạn. Ví dụ, OpenCV-2.4.6.
Sau đó, chọn thư viện người dùng mới của bạn (tức là OpenCV-2.4.6) và nhấp vào Thêm JAR bên ngoài.
Duyệt qua C: \ OpenCV-2.4.6 \ build \ java \ và chọn opencv-246.jar. Sau khi thêm jar, hãy mở rộng opencv-246.jar và chọn Vị trí thư viện gốc và nhấn Chỉnh sửa.
Chọn Thư mục Bên ngoài ... và duyệt để chọn thư mục C: \ OpenCV-2.4.6 \ build \ java \ x64. Nếu bạn có hệ thống 32-bit, bạn cần chọn thư mục x86 thay vì x64.
Nhấn Ok và bạn đã hoàn tất.
Bây giờ thư viện người dùng của bạn đã được tạo. Bây giờ bạn có thể sử dụng lại cấu hình này trong bất kỳ dự án nào.
Tạo dự án OpenCV
Tạo một dự án java mới trong eclipse.
Ở bước Cài đặt Java, trong tab Thư viện, chọn Thêm Thư viện ... và chọn OpenCV-2.4.6, sau đó bấm Kết thúc.
Nhấp vào kết thúc và bạn đã hoàn tất.
Để chuyển đổi hình ảnh màu sang hình ảnh Thang độ xám bằng OpenCV, chúng tôi đọc hình ảnh thành BufferedImage và chuyển nó thành MatVật. Cú pháp của nó được đưa ra dưới đây:
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
Sau đó, bạn có thể chuyển đổi hình ảnh từ định dạng RGB sang Grayscale bằng phương pháp cvtColor() bên trong Imgproclớp học. Cú pháp của nó được đưa ra dưới đây:
Imgproc.cvtColor(source mat, destination mat1, Imgproc.COLOR_RGB2GRAY);
Phương pháp cvtColor() lấy ba tham số là ma trận ảnh nguồn, ma trận ảnh đích và kiểu chuyển đổi màu.
Ngoài phương thức cvtColor, còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được liệt kê dưới đây -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để chuyển đổi một hình ảnh sang Grayscale:
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());
}
}
}
Đầu ra
Khi bạn thực thi ví dụ đã cho, nó sẽ chuyển đổi tên hình ảnh digital_image_processing.jpg vào hình ảnh Grayscale tương đương của nó và ghi nó trên đĩa cứng với tên grayscale.jpg.
Ảnh gốc
Hình ảnh thang độ xám
Để thay đổi không gian màu của hình ảnh này sang hình ảnh khác bằng OpenCV, chúng tôi đọc hình ảnh thành BufferedImage và chuyển nó thành MatVật. Cú pháp của nó được đưa ra dưới đây:
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
OpenCv cho phép nhiều kiểu chuyển đổi màu sắc, tất cả đều có thể tìm thấy trong lớp Imgproc. Một số loại được mô tả ngắn gọn -
Sr.No. | Loại chuyển đổi màu |
---|---|
1 | COLOR_RGB2BGR |
2 | COLOR_RGB2BGRA |
3 | COLOR_RGB2GRAY |
4 | COLOR_RGB2HLS |
5 | COLOR_RGB2HSV |
6 | COLOR_RGB2Luv |
7 | COLOR_RGB2YUV |
số 8 | COLOR_RGB2Lab |
Từ bất kỳ kiểu chuyển đổi màu nào, chỉ cần chuyển kiểu thích hợp vào phương thức cvtColor() bên trong Imgproclớp học. Cú pháp của nó được đưa ra dưới đây:
Imgproc.cvtColor(source mat, destination mat1, Color_Conversion_Code);
Phương pháp cvtColor() lấy ba tham số là ma trận ảnh nguồn, ma trận ảnh đích và kiểu chuyển đổi màu.
Ngoài phương thức cvtColor (), còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 | dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 | equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 | integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để chuyển đổi hình ảnh từ không gian màu này sang không gian màu khác.
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());
}
}
}
Đầu ra
Khi bạn thực thi ví dụ đã cho, nó sẽ chuyển đổi tên hình ảnh digital_image_processing.jpg vào hình ảnh không gian màu HSV tương đương của nó và ghi nó vào đĩa cứng với tên hsv.jpg.