Java DIP - คู่มือฉบับย่อ
Digital Image Processing (DIP) เกี่ยวข้องกับการจัดการภาพดิจิทัลโดยใช้คอมพิวเตอร์ดิจิทัล เป็นช่องสัญญาณและระบบย่อย แต่เน้นที่ภาพโดยเฉพาะ กรมทรัพย์สินทางปัญญามุ่งเน้นไปที่การพัฒนาระบบคอมพิวเตอร์ที่สามารถประมวลผลภาพได้ ข้อมูลเข้าของระบบดังกล่าวเป็นภาพดิจิทัล ระบบประมวลผลภาพโดยใช้อัลกอริทึมที่มีประสิทธิภาพและให้ภาพเป็นเอาต์พุต
Java เป็นภาษาโปรแกรมระดับสูงที่ใช้กันอย่างแพร่หลายในโลกสมัยใหม่ สามารถรองรับและจัดการการประมวลผลภาพดิจิทัลได้อย่างมีประสิทธิภาพโดยใช้ฟังก์ชันต่างๆ
BufferedImage
คลาสJava เป็นคลาสย่อยของคลาส Image ใช้เพื่อจัดการและจัดการข้อมูลรูปภาพ A BufferedImage
ทำจาก ColorModel ของข้อมูลภาพ BufferedImage
วัตถุทั้งหมดมีพิกัดมุมบนซ้ายเป็น (0, 0)
ตัวสร้าง
คลาสนี้รองรับคอนสตรัคเตอร์สามประเภท
ตัวสร้างแรกสร้างใหม่BufferedImage
ด้วย ColorModel และ Raster ที่ระบุ
BufferedImage(ColorModel cm, WritableRaster raster,
boolean isRasterPremultiplied, Hashtable<?,?> properties)
ตัวสร้างที่สองสร้างBufferedImage
หนึ่งในประเภทรูปภาพที่กำหนดไว้ล่วงหน้า
BufferedImage(int width, int height, int imageType)
ตัวสร้างที่สามสร้างBufferedImage
หนึ่งในประเภทรูปภาพที่กำหนดไว้ล่วงหน้า: TYPE_BYTE_BINARY หรือ TYPE_BYTE_INDEXED
BufferedImage(int width, int height, int imageType, IndexColorModel cm)
ซีเนียร์ No | วิธีการและคำอธิบาย |
---|---|
1 | copyData(WritableRaster outRaster) มันคำนวณพื้นที่สี่เหลี่ยมโดยพลการของ |
2 | getColorModel() ส่งคืนอ็อบเจ็กต์ของคลาส ColorModel ของรูปภาพ |
3 | getData() จะคืนรูปเป็นกระเบื้องขนาดใหญ่หนึ่งแผ่น |
4 | getData(Rectangle rect) มันคำนวณและส่งคืนพื้นที่โดยพลการของ |
5 | getGraphics() วิธีนี้ส่งคืน Graphics2D โดยยังคงความเข้ากันได้แบบย้อนหลัง |
6 | getHeight() จะคืนค่าความสูงของ |
7 | getMinX() มันส่งกลับ x |
8 | getMinY() มันกลับ y |
9 | getRGB(int x, int y) จะส่งคืนพิกเซลจำนวนเต็มในโมเดลสี RGB เริ่มต้น (TYPE_INT_ARGB) และพื้นที่สี sRGB เริ่มต้น |
10 | getType() มันส่งคืนประเภทรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้BufferedImage
คลาสjava ที่วาดข้อความบนหน้าจอโดยใช้ 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);
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ในบทนี้เราจะมาดูวิธีที่คุณสามารถดาวน์โหลดภาพจากอินเทอร์เน็ตใช้เทคนิคการประมวลผลภาพบนภาพจากนั้นอัปโหลดภาพที่ผ่านการประมวลผลไปยังเซิร์ฟเวอร์อีกครั้ง
การดาวน์โหลดรูปภาพ
ในการดาวน์โหลดรูปภาพจากเว็บไซต์เราใช้คลาส java ที่มีชื่อว่า URLซึ่งสามารถพบได้ใน java.netแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
String website = "http://tutorialspoint.com";
URL url = new URL(website);
นอกเหนือจากวิธีการข้างต้นแล้วยังมีวิธีการอื่น ๆ ใน URL ของคลาสดังที่อธิบายไว้โดยย่อ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | public String getPath() ส่งคืนเส้นทางของ URL |
2 | public String getQuery() ส่งคืนส่วนการสืบค้นของ URL |
3 | public String getAuthority() จะส่งคืนอำนาจของ URL |
4 | public int getPort() ส่งคืนพอร์ตของ URL |
5 | public int getDefaultPort() ส่งคืนพอร์ตเริ่มต้นสำหรับโปรโตคอลของ URL |
6 | public String getProtocol() ส่งคืนโปรโตคอลของ URL |
7 | public String getHost() ส่งคืนโฮสต์ของ URL |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส java URL เพื่อดาวน์โหลดภาพจากอินเทอร์เน็ต -
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());
}
}
}
เอาต์พุต
เมื่อคุณดำเนินการตามที่ระบุไว้ข้างต้นจะเห็นผลลัพธ์ต่อไปนี้
มันจะดาวน์โหลดภาพต่อไปนี้จากเซิร์ฟเวอร์
การอัปโหลดรูปภาพ
ให้เราดูวิธีการอัปโหลดภาพไปยังเว็บเซิร์ฟเวอร์ เราแปลง BufferedImage เป็นไบต์อาร์เรย์เพื่อส่งไปยังเซิร์ฟเวอร์
เราใช้คลาส Java ByteArrayOutputStreamซึ่งสามารถพบได้ใน java.ioแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
ในการแปลงภาพเป็นไบต์อาร์เรย์เราใช้ toByteArray() วิธีการของ ByteArrayOutputStreamชั้นเรียน. ไวยากรณ์ได้รับด้านล่าง -
byte[] bytes = baos.toByteArray();
นอกเหนือจากวิธีการข้างต้นแล้วยังมีวิธีการอื่น ๆ ที่มีอยู่ในคลาส ByteArrayOutputStream ตามที่อธิบายไว้โดยย่อ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | public void reset() วิธีนี้จะรีเซ็ตจำนวนไบต์ที่ถูกต้องของสตรีมเอาต์พุตไบต์อาร์เรย์เป็นศูนย์ดังนั้นเอาต์พุตที่สะสมทั้งหมดในสตรีมจะถูกละทิ้ง |
2 | public byte[] toByteArray() วิธีนี้สร้างอาร์เรย์ไบต์ที่จัดสรรใหม่ ขนาดของมันจะเป็นขนาดปัจจุบันของสตรีมเอาต์พุตและเนื้อหาของบัฟเฟอร์จะถูกคัดลอกลงในนั้น ส่งคืนเนื้อหาปัจจุบันของสตรีมเอาต์พุตเป็นอาร์เรย์ไบต์ |
3 | public String toString() แปลงเนื้อหาบัฟเฟอร์เป็นสตริง การแปลจะกระทำตามการเข้ารหัสอักขระเริ่มต้น ส่งคืนสตริงที่แปลจากเนื้อหาของบัฟเฟอร์ |
4 | public void write(int w) มันเขียนอาร์เรย์ที่ระบุไปยังเอาต์พุตสตรีม |
5 | public void write(byte []b, int of, int len) เขียนจำนวนไบต์ของเลนโดยเริ่มจาก offset off ไปยังสตรีม |
6 | public void writeTo(OutputStream outSt) เขียนเนื้อหาทั้งหมดของสตรีมนี้ไปยังอาร์กิวเมนต์สตรีมที่ระบุ |
ตัวอย่าง
ตัวอย่างต่อไปนี้สาธิต ByteArrayOutputStream เพื่ออัพโหลดภาพไปยังเซิร์ฟเวอร์ -
รหัสลูกค้า
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();
}
}
รหัสเซิร์ฟเวอร์
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);
}
}
เอาต์พุต
เอาต์พุตฝั่งไคลเอ็นต์
เมื่อคุณรันโค้ดไคลเอนต์ผลลัพธ์ต่อไปนี้จะปรากฏที่ฝั่งไคลเอ็นต์ -
เอาต์พุตฝั่งเซิร์ฟเวอร์
เมื่อคุณรันโค้ดเซิร์ฟเวอร์ ouptut ต่อไปนี้จะปรากฏที่ฝั่งเซิร์ฟเวอร์ -
หลังจากได้รับภาพเซิร์ฟเวอร์จะแสดงภาพดังที่แสดงด้านล่าง -
รูปภาพประกอบด้วยพิกเซลอาร์เรย์สองมิติ แท้จริงแล้วมันคือค่าของพิกเซลที่ประกอบเป็นรูปภาพ โดยปกติภาพอาจเป็นสีหรือโทนสีเทา
ใน Java คลาส BufferedImage ถูกใช้เพื่อจัดการกับอิมเมจ คุณต้องโทรgetRGB() วิธีการของ BufferedImage คลาสเพื่อรับค่าของพิกเซล
รับค่าพิกเซล
ค่าพิกเซลสามารถรับได้โดยใช้ไวยากรณ์ต่อไปนี้
Color c = new Color(image.getRGB(j, i));
รับค่า RGB
วิธีการ getRGB()รับดัชนีแถวและคอลัมน์เป็นพารามิเตอร์และส่งคืนพิกเซลที่เหมาะสม ในกรณีของภาพสีจะส่งคืนค่าสามค่า ได้แก่ (แดงเขียวน้ำเงิน) สามารถรับได้ดังนี้
c.getRed();
c.getGreen();
c.getBlue();
การรับความกว้างและความสูงของภาพ
สามารถรับความสูงและความกว้างของภาพได้โดยเรียกไฟล์ getWidth() และ getHeight()วิธีการของคลาส BufferedImage ไวยากรณ์ได้รับด้านล่าง
int width = image.getWidth();
int height = image.getHeight();
นอกเหนือจากวิธีการเหล่านี้แล้วยังมีวิธีการอื่น ๆ ที่รองรับในคลาส BufferedImage อธิบายสั้น ๆ
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | copyData(WritableRaster outRaster) มันคำนวณพื้นที่สี่เหลี่ยมของ BufferedImage โดยพลการและคัดลอกลงใน WritableRaster ที่ระบุ |
2 | getColorModel() ส่งคืน ColorModel ของรูปภาพ |
3 | getData() จะคืนรูปเป็นกระเบื้องขนาดใหญ่หนึ่งแผ่น |
4 | getData(Rectangle rect) คำนวณและส่งคืนพื้นที่โดยพลการของ BufferedImage |
5 | getGraphics() วิธีนี้ส่งคืน Graphics2D แต่สำหรับความเข้ากันได้แบบย้อนกลับ |
6 | getHeight() จะส่งกลับความสูงของ BufferedImage |
7 | getMinX() ส่งคืนพิกัด x ขั้นต่ำของ BufferedImage นี้ |
8 | getMinY() ส่งคืนพิกัด y ขั้นต่ำของ BufferedImage นี้ |
9 | getRGB(int x, int y) จะส่งคืนพิกเซลจำนวนเต็มในโมเดลสี RGB เริ่มต้น (TYPE_INT_ARGB) และพื้นที่สี sRGB เริ่มต้น |
10 | getType() มันส่งคืนประเภทรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส java BufferedImage ที่แสดงพิกเซลของรูปภาพขนาด (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();
}
}
เอาต์พุต
เมื่อคุณดำเนินการตามตัวอย่างข้างต้นมันจะพิมพ์พิกเซลของภาพต่อไปนี้ -
Original Image
Pixels Output
หากคุณเลื่อน ouput ลงจะเห็นรูปแบบต่อไปนี้
ในการแปลงภาพสีเป็นภาพระดับสีเทาคุณต้องอ่านพิกเซลหรือข้อมูลของภาพโดยใช้ File และ ImageIO วัตถุและจัดเก็บภาพในรูปแบบ BufferedImageวัตถุ. ไวยากรณ์ได้รับด้านล่าง -
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
นอกจากนี้รับค่าพิกเซลโดยใช้วิธีการ getRGB()และดำเนินการ GrayScale () วิธีการกับมัน เมธอด getRGB () ใช้ดัชนีแถวและคอลัมน์เป็นพารามิเตอร์
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);
นอกเหนือจากสามวิธีนี้แล้วยังมีวิธีการอื่น ๆ ในคลาสสีตามที่อธิบายไว้โดยย่อ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | brighter() สร้างสีใหม่ที่เป็นสีที่สว่างกว่านี้ |
2 | darker() สร้างสีใหม่ที่เป็นสีเข้มกว่าของสีนี้ |
3 | getAlpha() จะส่งคืนองค์ประกอบอัลฟาในช่วง 0-255 |
4 | getHSBColor(float h, float s, float b) สร้างวัตถุสีตามค่าที่ระบุสำหรับโมเดลสี HSB |
5 | HSBtoRGB(float hue, float saturation, float brightness) จะแปลงส่วนประกอบของสีตามที่ระบุโดยรุ่น HSB เป็นชุดค่าที่เทียบเท่าสำหรับรุ่น RGB เริ่มต้น |
6 | toString() ส่งคืนการแสดงสตริงของสีนี้ |
ขั้นตอนสุดท้ายคือการเพิ่มทั้งสามค่าและตั้งค่าอีกครั้งเป็นค่าพิกเซลที่เกี่ยวข้อง ไวยากรณ์ได้รับด้านล่าง -
int sum = red+green+blue;
Color newColor = new Color(sum,sum,sum);
image.setRGB(j,i,newColor.getRGB());
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Java BufferedImage ที่แปลงรูปภาพเป็น 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();
}
}
เอาต์พุต
เมื่อคุณดำเนินการตามตัวอย่างที่กำหนดมันจะแปลงรูปภาพ digital_image_processing.jpg ให้เทียบเท่ากับภาพ Grayscale และเขียนลงบนฮาร์ดดิสก์ด้วยชื่อ grayscale.jpg.
ภาพต้นฉบับ
ภาพระดับสีเทา
ในบทนี้เรียนรู้วิธีเพิ่มความคมชัดของภาพโดยใช้การปรับสมดุลของฮิสโตแกรม
เราใช้ไฟล์ OpenCV ฟังก์ชัน equalizeHist()วิธี. สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Imgproc.equalizeHist(source, destination);
พารามิเตอร์อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | Source เป็นภาพต้นฉบับ 8 บิตช่องเดียว |
2 | Destination มันคือภาพปลายทาง |
นอกเหนือจากเมธอด equalizeHist () แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อเพิ่มความเปรียบต่างของภาพ -
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพคอนทราสต์ขั้นสูง
ในบทนี้เราจะเพิ่มความสว่างของภาพโดยการคูณแต่ละพิกเซลของภาพด้วยค่าอัลฟาและเพิ่มค่าเบต้าอื่นเข้าไป
เรา OpenCV ฟังก์ชัน convertToที่ดำเนินการข้างต้นโดยอัตโนมัติ สามารถดูได้ที่ด้านล่างMatแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
int alpha = 2;
int beta = 50;
sourceImage.convertTo(destination, rtype , alpha, beta);
พารามิเตอร์อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | destination เป็นภาพปลายทาง |
2 | rtype เป็นประเภทเมทริกซ์เอาต์พุตที่ต้องการหรือค่อนข้างลึกเนื่องจากจำนวนช่องสัญญาณเหมือนกับอินพุตที่มี ถ้า rtype เป็นลบเมทริกซ์เอาต์พุตจะมีประเภทเดียวกับอินพุต |
3 | alpha เป็นสเกลแฟกเตอร์เสริม |
4 | beta เป็นเดลต้าทางเลือกที่เพิ่มให้กับค่าที่ปรับขนาด |
นอกเหนือจากเมธอด convertTo แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Mat มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | adjustROI(int dtop, int dbottom, int dleft, int dright) จะปรับขนาดและตำแหน่งย่อยในเมทริกซ์หลัก |
2 | copyTo(Mat m) มันคัดลอกเมทริกซ์ไปยังอีกอันหนึ่ง |
3 | diag() มันดึงเส้นทแยงมุมออกจากเมทริกซ์หรือสร้างเมทริกซ์แนวทแยง |
4 | dot(Mat m) มันคำนวณผลคูณดอทของเวกเตอร์สองตัว |
5 | reshape(int cn) มันเปลี่ยนรูปร่างและ / หรือจำนวนช่องของเมทริกซ์ 2 มิติโดยไม่ต้องคัดลอกข้อมูล |
6 | submat(Range rowRange, Range colRange) มันแยกเมทริกซ์ย่อยเป็นรูปสี่เหลี่ยมผืนผ้า |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Mat เพื่อเพิ่มความสว่างของภาพ -
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ปรับปรุงภาพสว่าง (Alpha = 1 & Beta = 50)
ปรับปรุงภาพสว่าง (อัลฟ่า = 2 และเบต้า = 50)
ในบทนี้เราเรียนรู้การเพิ่มความคมชัดของภาพโดยใช้ฟิลเตอร์ Gaussian
ก่อนอื่นเราใช้ OpenCV ฟังก์ชัน GaussianBlur. สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Imgproc.GaussianBlur(source, destination, new Size(0,0), sigmaX);
พารามิเตอร์อธิบายสั้น ๆ -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | source เป็นภาพต้นฉบับ |
2 | destination เป็นภาพปลายทาง |
3 | Size เป็นขนาดเคอร์เนล Gaussian |
4 | sigmaX เป็นค่าเบี่ยงเบนมาตรฐานของเคอร์เนล Gaussian ในทิศทาง X |
นอกจากนี้เราใช้ OpenCV ฟังก์ชัน addWeightedเพื่อใช้ลายน้ำภาพกับภาพ สามารถดูได้ที่ด้านล่างCoreแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Core.addWeighted(InputArray src1, alpha, src2, beta, gamma, OutputArray dst);
พารามิเตอร์ของฟังก์ชันนี้อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | src1 เป็นอาร์เรย์อินพุตแรก |
2 | alpha เป็นน้ำหนักขององค์ประกอบอาร์เรย์แรก |
3 | src2 เป็นอาร์เรย์อินพุตที่สองที่มีขนาดและหมายเลขช่องเดียวกันกับ src1 |
4 | Beta เป็นน้ำหนักขององค์ประกอบอาร์เรย์ที่สอง |
5 | gamma มันเป็นสเกลาร์ที่เพิ่มเข้าไปในแต่ละผลรวม |
6 | dst เป็นอาร์เรย์เอาต์พุตที่มีขนาดและจำนวนช่องเดียวกันกับอาร์เรย์อินพุต |
นอกเหนือจากวิธี GaussianBlur แล้วยังมีวิธีอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้สาธิตการใช้ Imgproc และ Core class เพื่อปรับความคมชัดให้กับภาพ -
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) {
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพคมชัด
ภาพสามารถบีบอัดและจัดเก็บผ่าน Java ได้อย่างง่ายดาย การบีบอัดภาพเกี่ยวข้องกับการแปลงภาพเป็น jpg และจัดเก็บ
ในการบีบอัดภาพเราจะอ่านภาพและแปลงเป็นวัตถุ BufferedImage
นอกจากนี้เราได้รับ ImageWriter จาก getImageWritersByFormatName()วิธีการที่พบในคลาส ImageIO จาก ImageWriter นี้ให้สร้างไฟล์ImageWriteParamวัตถุ. ไวยากรณ์ได้รับด้านล่าง -
Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();
จากออบเจ็กต์ ImageWriteParam นี้คุณสามารถตั้งค่าการบีบอัดโดยเรียกสองวิธีการนี้ซึ่งก็คือ setCompressionMode() และ setCompressionQuality(). ไวยากรณ์ของพวกเขามีดังต่อไปนี้ -
obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);
เมธอด setCompressionMode () ใช้ Mode_EXPLICIT เป็นพารามิเตอร์ โหมดอื่น ๆ บางส่วนจะอธิบายสั้น ๆ -
ซีเนียร์ | โหมด |
---|---|
1 | MODE_DEFAULT เป็นค่าคงที่ที่อาจส่งผ่านไปยังวิธีการเพื่อเปิดใช้งานคุณลักษณะนั้นสำหรับการเขียนในอนาคต |
2 | MODE_DISABLED เป็นค่าคงที่ที่อาจส่งผ่านไปยังเมธอดเพื่อปิดใช้งานคุณลักษณะนั้นสำหรับการเขียนในอนาคต |
3 | MODE_EXPLICIT เป็นค่าคงที่ที่อาจส่งผ่านไปยังวิธีการเพื่อเปิดใช้งานคุณลักษณะนั้นสำหรับการเขียนในอนาคต |
นอกเหนือจากวิธีการบีบอัดแล้วยังมีวิธีการอื่น ๆ ที่จัดเตรียมโดยคลาส ImageWriteParam มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | canOffsetTiles() จะคืนค่าเป็นจริงหากผู้เขียนสามารถทำการเรียงไทล์ด้วยการชดเชยกริดที่ไม่ใช่ศูนย์ขณะเขียน |
2 | getBitRate(float quality) ส่งคืนค่าลอยตัวที่ระบุจำนวนบิตของข้อมูลเอาต์พุตโดยประมาณสำหรับข้อมูลภาพอินพุตแต่ละบิตในระดับคุณภาพที่กำหนด |
3 | getLocale() จะส่งคืน Locale ที่ตั้งไว้ในปัจจุบันหรือ null หากรองรับเฉพาะ Locale เริ่มต้น |
4 | isCompressionLossless() จะคืนค่าเป็นจริงหากประเภทการบีบอัดปัจจุบันให้การบีบอัดแบบไม่สูญเสีย |
5 | unsetCompression() จะลบประเภทการบีบอัดและการตั้งค่าคุณภาพก่อนหน้านี้ |
6 | unsetTiling() จะลบพารามิเตอร์ตารางไทล์ก่อนหน้าใด ๆ ที่ระบุโดยการเรียกใช้ setTiling |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส ImageWriteParam เพื่อบีบอัดรูปภาพ -
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();
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดมันจะบีบอัดรูปภาพ digital_image_processing.jpg ให้เทียบเท่ากับอิมเมจที่บีบอัดและเขียนลงในฮาร์ดดิสก์ด้วยชื่อ compress.jpg.
ภาพต้นฉบับ
ภาพบีบอัด - ปัจจัยด้านคุณภาพ - 0.05
ภาพบีบอัด - ปัจจัยด้านคุณภาพ - 0.5
ในบทนี้เราเรียนรู้การเพิ่มเส้นขอบประเภทต่างๆให้กับรูปภาพ
เราใช้ OpenCV ฟังก์ชัน copyMakeBorder. สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Imgproc.copyMakeBorder(source,destination,top,bottom,left,right,borderType);
พารามิเตอร์อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | source เป็นภาพต้นฉบับ |
2 | destination เป็นภาพปลายทาง |
3 | top ความยาวเป็นพิกเซลของเส้นขอบที่ด้านบนของภาพ |
4 | bottom ความยาวเป็นพิกเซลของเส้นขอบที่ด้านล่างของรูปภาพ |
5 | left คือความยาวเป็นพิกเซลของเส้นขอบทางด้านซ้ายของภาพ |
6 | right คือความยาวเป็นพิกเซลของเส้นขอบทางด้านขวาของภาพ |
7 | borderType กำหนดประเภทของเส้นขอบ เส้นขอบที่เป็นไปได้ ได้แก่ BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_CONSTANT เป็นต้น |
นอกเหนือจากเมธอด copyMakeBorder () แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อเพิ่มเส้นขอบให้กับรูปภาพ -
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพเส้นขอบที่แยกได้
รูปภาพชายแดนห่อ
สะท้อนภาพชายแดน
พีระมิดรูปภาพเป็นเพียงวิธีการแสดงภาพหลายความละเอียด เลเยอร์ล่างสุดคือรูปภาพเวอร์ชันที่มีความละเอียดสูงสุดและเลเยอร์บนสุดเป็นเวอร์ชันที่มีความละเอียดต่ำสุดของรูปภาพ ปิรามิดของรูปภาพถูกใช้เพื่อจัดการกับรูปภาพในระดับต่างๆ
ในบทนี้เราจะทำการสุ่มตัวอย่างและเพิ่มการสุ่มตัวอย่างบนรูปภาพ
เราใช้ OpenCV ฟังก์ชั่น pyrUp และ pyrDown. สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Imgproc.pyrUp(source, destination, destinationSize);
Imgproc.pyrDown(source, destination,destinationSize);
พารามิเตอร์อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | source มันเป็นภาพที่มา |
2 | destination มันคือภาพปลายทาง |
3 | destinationSize เป็นขนาดของภาพที่ส่งออก โดยค่าเริ่มต้นจะคำนวณเป็นขนาด ((src.cols * 2), (src.rows * 2)) |
นอกเหนือจากเมธอด pyrUp และ pyrDown แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อทำการสุ่มตัวอย่างและลดการสุ่มตัวอย่างบนรูปภาพ
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ในภาพต้นฉบับจะมีการดำเนินการ pyrUp (UP Sampling) และ pyrDown (Down Sampling) ผลลัพธ์หลังจากการสุ่มตัวอย่างเป็นดังที่แสดงด้านล่าง -
รูปภาพ PyrUP
รูปภาพ pyrDown
Thresholding ช่วยให้สามารถแบ่งส่วนภาพได้ด้วยวิธีที่ง่ายที่สุด การแบ่งส่วนภาพหมายถึงการแบ่งภาพที่สมบูรณ์ออกเป็นชุดพิกเซลในลักษณะที่พิกเซลในแต่ละชุดมีลักษณะทั่วไปบางประการ การแบ่งส่วนภาพมีประโยชน์อย่างมากในการกำหนดวัตถุและขอบเขตของวัตถุ
ในบทนี้เราจะดำเนินการเกณฑ์พื้นฐานบางอย่างกับรูปภาพ
เราใช้ OpenCV ฟังก์ชัน threshold. สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Imgproc.threshold(source, destination, thresh , maxval , type);
พารามิเตอร์อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | source เป็นภาพต้นฉบับ |
2 | destination เป็นภาพปลายทาง |
3 | thresh เป็นค่าเกณฑ์ |
4 | maxval เป็นค่าสูงสุดที่จะใช้กับเกณฑ์ประเภท THRESH_BINARY และ THRESH_BINARY_INV |
5 | type ประเภทที่เป็นไปได้ ได้แก่ THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC และ THRESH_TOZERO |
นอกเหนือจากวิธีการขีด จำกัด เหล่านี้แล้วยังมีวิธีอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อดำเนินการขีด จำกัด กับรูปภาพ -
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ในภาพต้นฉบับด้านบนจะมีการดำเนินการขีด จำกัด บางอย่างซึ่งแสดงในเอาต์พุตด้านล่าง -
Thresh ไบนารี
Thresh Binary Invert
Thresh Zero
รูปร่างของภาพสามารถเปลี่ยนแปลงได้อย่างง่ายดายโดยใช้ OpenCV ภาพสามารถพลิกปรับขนาดหรือหมุนภาพใดก็ได้จากสี่ทิศทาง
ในการเปลี่ยนรูปร่างของภาพเราอ่านภาพและแปลงเป็นวัตถุ Mat ไวยากรณ์ได้รับด้านล่าง -
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
พลิกภาพ
OpenCV อนุญาตให้ใช้รหัสพลิกสามประเภทซึ่งอธิบายไว้ด้านล่าง -
ซีเนียร์ | พลิกรหัสและคำอธิบาย |
---|---|
1 | 0 0 หมายถึงพลิกไปรอบ ๆ แกน x |
2 | 1 1 หมายถึงพลิกรอบแกน y |
3 | -1 -1 หมายถึงพลิกไปรอบ ๆ แกนทั้งสอง |
เราส่งรหัสพลิกที่เหมาะสมไปยังวิธีการ flip() ใน Coreชั้นเรียน. ไวยากรณ์ได้รับด้านล่าง -
Core.flip(source mat, destination mat1, flip_code);
วิธีการ flip() รับพารามิเตอร์สามตัว - เมทริกซ์อิมเมจต้นทางเมทริกซ์รูปภาพปลายทางและโค้ดพลิก
นอกเหนือจากวิธีการพลิกแล้วยังมีวิธีอื่น ๆ ที่จัดเตรียมโดยคลาส Core มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | add(Mat src1, Mat src2, Mat dst) จะคำนวณผลรวมต่อองค์ประกอบของสองอาร์เรย์หรืออาร์เรย์และสเกลาร์ |
2 | bitwise_and(Mat src1, Mat src2, Mat dst) จะคำนวณการรวมบิตที่ชาญฉลาดต่อองค์ประกอบของสองอาร์เรย์หรืออาร์เรย์และสเกลาร์ |
3 | bitwise_not(Mat src, Mat dst) มันจะสลับทุกบิตของอาร์เรย์ |
4 | circle(Mat img, Point center, int radius, Scalar color) มันวาดวงกลม |
5 | sumElems(Mat src) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | subtract(Mat src1, Scalar src2, Mat dst, Mat mask) จะคำนวณความแตกต่างต่อองค์ประกอบระหว่างสองอาร์เรย์หรืออาร์เรย์และสเกลาร์ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Core เพื่อพลิกภาพ -
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());
}
}
}
เอาต์พุต
เมื่อคุณเรียกใช้ตัวอย่างข้างต้นมันจะพลิกชื่อภาพ digital_image_processing.jpg เป็นอิมเมจพื้นที่สี HSV ที่เทียบเท่าและเขียนลงบนฮาร์ดดิสก์พร้อมชื่อ flip.jpg.
ภาพต้นฉบับ
พลิกภาพ
ในบทนี้เราใช้ฟิลเตอร์ Gaussian กับภาพที่เบลอภาพ เราจะใช้ฟังก์ชัน OpenCV GaussianBlur เพื่อใช้ตัวกรอง Gaussian กับรูปภาพ สามารถพบได้ในแพ็คเกจ Imgproc ไวยากรณ์ได้รับด้านล่าง -
Imgproc.GaussianBlur(source, destination,Size,SigmaX);
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | source เป็นภาพต้นฉบับ |
2 | destination เป็นภาพปลายทาง |
3 | Size เป็นขนาดเคอร์เนล Gaussian |
4 | SigmaX เป็นค่าเบี่ยงเบนมาตรฐานของเคอร์เนล Gaussian ในทิศทาง X |
นอกเหนือจากวิธี GaussianBlur แล้วยังมีวิธีอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้ตัวกรอง Gaussian กับรูปภาพ
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
เมื่อภาพต้นฉบับนี้เชื่อมต่อกับฟิลเตอร์ Gaussian ขนาด 11 และ 45 จะเห็นผลลัพธ์ต่อไปนี้
ไส้กรอง Gaussian ขนาด 11
กรองเกาส์ขนาด 45
เราใช้ตัวกรองกล่องที่ทำให้ภาพเบลอ ตัวกรองกล่องอาจมีขนาด 3x3, 5x5, 9x9 เป็นต้น
เราใช้ OpenCV ฟังก์ชัน filter2Dเพื่อใช้ตัวกรองกล่องกับรูปภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | src เป็นภาพต้นฉบับ |
2 | dst เป็นภาพปลายทาง |
3 | depth มันคือความลึกของ dst ค่าลบ (เช่น -1) บ่งชี้ว่าความลึกเหมือนกับแหล่งที่มา |
4 | kernel เป็นเคอร์เนลที่จะสแกนผ่านภาพ |
5 | anchor เป็นตำแหน่งของจุดยึดที่สัมพันธ์กับเคอร์เนล ตำแหน่งจุด (-1, -1) ระบุจุดศูนย์กลางตามค่าเริ่มต้น |
6 | delta เป็นค่าที่จะเพิ่มให้กับแต่ละพิกเซลระหว่างการแปลง โดยค่าเริ่มต้นจะเป็น 0 |
7 | BORDER_DEFAULT เราปล่อยให้ค่านี้เป็นค่าเริ่มต้น |
นอกเหนือจากเมธอด filter2D () แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้ตัวกรอง Box กับภาพของ 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 = 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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ในตัวอย่างนี้เราสร้างภาพของเราด้วยตัวกรองต่อไปนี้ (เคอร์เนล) ตัวกรองนี้ส่งผลให้ภาพเบลอเมื่อขนาดเพิ่มขึ้น
ภาพต้นฉบับนี้ได้รับการแก้ไขโดยใช้ตัวกรองกล่องขนาด 5 ซึ่งได้รับด้านล่าง -
กล่องกรองขนาด 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 |
ภาพที่ได้รับการแก้ไข (พร้อมตัวกรองกล่องขนาด 5)
ภาพที่ได้รับการแก้ไข (พร้อมตัวกรองกล่องขนาด 9)
ในบทนี้เราได้เรียนรู้การใช้ตัวดำเนินการทางสัณฐานวิทยาทั่วไปสองตัว: การขยายตัวและการพังทลาย
เราใช้ OpenCV ฟังก์ชัน erode และ dilate. สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Imgproc.erode(source, destination, element);
Imgproc.dilate(source, destination, element);
พารามิเตอร์อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | source เป็นภาพต้นฉบับ |
2 | destination เป็นภาพปลายทาง |
3 | element เป็นองค์ประกอบโครงสร้างที่ใช้สำหรับการกัดเซาะและการขยายตัวถ้าองค์ประกอบ = Mat () จะใช้องค์ประกอบโครงสร้างสี่เหลี่ยมขนาด 3 x 3 |
นอกเหนือจากวิธีการ erode () และ dilate () แล้วยังมีวิธีอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อทำการกร่อนและการขยายภาพ -
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ในภาพต้นฉบับด้านบนมีการดำเนินการกัดเซาะและการขยายตัวซึ่งแสดงไว้ในผลลัพธ์ด้านล่าง -
การพังทลาย
การขยายตัว
ในบทนี้เราจะเรียนรู้สองวิธีในการใช้ลายน้ำบนรูปภาพ วิธีเหล่านี้คือ -
- การใช้ลายน้ำข้อความ
- การใช้ลายน้ำภาพ
การใช้ลายน้ำข้อความ
เราใช้ OpenCV ฟังก์ชัน putTextเพื่อใช้ลายน้ำข้อความกับรูปภาพ สามารถดูได้ที่ด้านล่างCoreแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Core.putText(source, Text, Point, fontFace ,fontScale , color);
พารามิเตอร์ของฟังก์ชันนี้อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | Source เป็นภาพต้นฉบับ |
2 | Text เป็นข้อความสตริงที่จะปรากฏบนรูปภาพ |
3 | Point เป็นจุดที่ข้อความควรปรากฏบนรูปภาพ |
4 | fontFace แบบอักษร ตัวอย่างเช่น - FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX เป็นต้น |
5 | fontScale เป็นตัวคูณมาตราส่วนแบบอักษรที่คูณด้วยขนาดฐานเฉพาะแบบอักษร |
6 | color เป็นสีข้อความ |
นอกเหนือจากเมธอด putText แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Core มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | normalize(Mat src, Mat dst, double alpha, double beta, int norm_type) ทำให้บรรทัดฐานหรือช่วงค่าของอาร์เรย์เป็นปกติ |
2 | perspectiveTransform(Mat src, Mat dst, Mat m) ทำการแปลงเมทริกซ์มุมมองของเวกเตอร์ |
3 | phase(Mat x, Mat y, Mat angle) คำนวณมุมการหมุนของเวกเตอร์ 2 มิติ |
4 | rectangle(Mat img, Point pt1, Point pt2, Scalar color) วาดรูปสี่เหลี่ยมมุมฉากที่เรียบง่ายหนาหรือเต็มขึ้น |
5 | reduce(Mat src, Mat dst, int dim, int rtype, int dtype) จะลดเมทริกซ์เป็นเวกเตอร์ |
6 | transform(Mat src, Mat dst, Mat m) ดำเนินการแปลงเมทริกซ์ของทุกองค์ประกอบอาร์เรย์ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Core เพื่อใช้ลายน้ำข้อความกับรูปภาพ -
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ข้อความลายน้ำรูปภาพ
การใช้ลายน้ำรูปภาพบนรูปภาพ
เรากำลังจะใช้ OpenCV ฟังก์ชัน addWeightedเพื่อใช้ลายน้ำภาพกับภาพ สามารถดูได้ที่ด้านล่างCoreแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Core.addWeighted(InputArray src1, alpha, src2 (Watermark image), beta, gamma, OutputArray dst);
พารามิเตอร์ของฟังก์ชันนี้อธิบายไว้ด้านล่าง -
ซีเนียร์ | พารามิเตอร์และคำอธิบาย |
---|---|
1 | src1 เป็นอาร์เรย์อินพุตแรก |
2 | alpha มันคือน้ำหนักขององค์ประกอบอาร์เรย์แรก |
3 | src2 เป็นอาร์เรย์อินพุตที่สองที่มีขนาดและหมายเลขช่องเดียวกันกับ src1 |
4 | beta มันคือน้ำหนักขององค์ประกอบอาร์เรย์ที่สอง |
5 | gamma มันคือสเกลาร์ที่เพิ่มเข้าไปในแต่ละผลรวม |
6 | dst เป็นอาร์เรย์เอาต์พุตที่มีขนาดและจำนวนช่องเดียวกันกับอาร์เรย์อินพุต |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Core เพื่อใช้ลายน้ำรูปภาพกับรูปภาพ -
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพลายน้ำ
ภาพลายน้ำ
Convolution คือการดำเนินการทางคณิตศาสตร์ในสองฟังก์ชัน f และ g ฟังก์ชัน f และ g ในกรณีนี้คือรูปภาพเนื่องจากรูปภาพเป็นฟังก์ชันสองมิติเช่นกัน
การแสดง Convolution
ในการดำเนินการ Convolution กับรูปภาพให้ทำตามขั้นตอนต่อไปนี้ -
- พลิกหน้ากาก (แนวนอนและแนวตั้ง) เพียงครั้งเดียว
- เลื่อนหน้ากากไปที่รูปภาพ
- คูณองค์ประกอบที่เกี่ยวข้องแล้วเพิ่ม
- ทำซ้ำขั้นตอนนี้จนกว่าค่าทั้งหมดของภาพจะได้รับการคำนวณ
เราใช้ OpenCV ฟังก์ชัน filter2Dเพื่อใช้การแปลงภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | src เป็นภาพต้นฉบับ |
2 | dst เป็นภาพปลายทาง |
3 | depth มันคือความลึกของ dst ค่าลบ (เช่น -1) บ่งชี้ว่าความลึกเหมือนกับแหล่งที่มา |
4 | kernel เป็นเคอร์เนลที่จะสแกนผ่านภาพ |
5 | anchor เป็นตำแหน่งของจุดยึดที่สัมพันธ์กับเคอร์เนล ตำแหน่งจุด (-1, -1) ระบุจุดศูนย์กลางตามค่าเริ่มต้น |
6 | delta เป็นค่าที่จะเพิ่มให้กับแต่ละพิกเซลระหว่างการแปลง โดยค่าเริ่มต้นจะเป็น 0 |
7 | BORDER_DEFAULT เราปล่อยให้ค่านี้เป็นค่าเริ่มต้น |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อดำเนินการ Convolution บนรูปภาพของ 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 = 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());
}
}
}
เอาต์พุต
ในตัวอย่างนี้เราสร้างภาพของเราด้วยตัวกรองต่อไปนี้ (เคอร์เนล) ตัวกรองนี้ส่งผลให้สร้างภาพต้นฉบับตามที่เป็นจริง -
0 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
ภาพต้นฉบับ
ภาพที่ได้รับการแก้ไข
ตัวดำเนินการ Prewitt ใช้สำหรับการตรวจจับขอบในภาพ ตรวจจับขอบสองประเภท: ขอบแนวตั้งและขอบแนวนอน
เราใช้ OpenCV ฟังก์ชัน filter2Dเพื่อใช้ตัวดำเนินการ Prewitt กับรูปภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | src เป็นภาพต้นฉบับ |
2 | dst เป็นภาพปลายทาง |
3 | depth มันคือความลึกของ dst ค่าลบ (เช่น -1) บ่งชี้ว่าความลึกเหมือนกับแหล่งที่มา |
4 | kernel เป็นเคอร์เนลที่จะสแกนผ่านภาพ |
5 | anchor เป็นตำแหน่งของจุดยึดที่สัมพันธ์กับเคอร์เนล ตำแหน่งจุด (-1, -1) ระบุจุดศูนย์กลางตามค่าเริ่มต้น |
6 | delta เป็นค่าที่จะเพิ่มให้กับแต่ละพิกเซลระหว่างการแปลง โดยค่าเริ่มต้นจะเป็น 0 |
7 | BORDER_DEFAULT เราปล่อยให้ค่านี้เป็นค่าเริ่มต้น |
นอกเหนือจากเมธอด filter2D แล้วยังมีวิธีอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้ตัวดำเนินการ Prewitt กับอิมเมจของ 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,-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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพต้นฉบับนี้เชื่อมต่อกับตัวดำเนินการ Prewitt ของขอบแนวตั้งตามที่ระบุด้านล่าง -
ทิศทางแนวตั้ง
-1 | 0 | 1 |
-1 | 0 | 1 |
-1 | 0 | 1 |
ภาพที่ได้รับการแก้ไข (ทิศทางแนวตั้ง)
ภาพต้นฉบับนี้ได้รับการแก้ไขด้วยตัวดำเนินการ Prewitt ของขอบแนวนอนซึ่งแสดงไว้ด้านล่าง -
ทิศทางแนวนอน
-1 | -1 | -1 |
0 | 0 | 0 |
1 | 1 | 1 |
ภาพที่ได้รับการแก้ไข (ทิศทางแนวนอน)
ตัวดำเนินการ Sobel คล้ายกับตัวดำเนินการ Prewitt มาก นอกจากนี้ยังเป็นมาสก์อนุพันธ์และใช้สำหรับการตรวจจับขอบ ตัวดำเนินการ Sobel ใช้เพื่อตรวจจับขอบสองประเภทในภาพ: ขอบทิศทางแนวตั้งและขอบทิศทางแนวนอน
เรากำลังจะใช้ OpenCV ฟังก์ชัน filter2Dเพื่อใช้ตัวดำเนินการ Sobel กับรูปภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | การโต้เถียง |
---|---|
1 | src เป็นภาพต้นฉบับ |
2 | dst เป็นภาพปลายทาง |
3 | depth มันคือความลึกของ dst ค่าลบ (เช่น -1) บ่งชี้ว่าความลึกเหมือนกับแหล่งที่มา |
4 | kernel เป็นเคอร์เนลที่จะสแกนผ่านภาพ |
5 | anchor เป็นตำแหน่งของจุดยึดที่สัมพันธ์กับเคอร์เนล ตำแหน่งจุด (-1, -1) ระบุจุดศูนย์กลางตามค่าเริ่มต้น |
6 | delta เป็นค่าที่จะเพิ่มให้กับแต่ละพิกเซลระหว่างการแปลง โดยค่าเริ่มต้นจะเป็น 0 |
7 | BORDER_DEFAULT เราปล่อยให้ค่านี้เป็นค่าเริ่มต้น |
นอกเหนือจากเมธอด filter2D แล้วยังมีวิธีอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้ตัวดำเนินการ Sobel กับอิมเมจของ 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,-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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพต้นฉบับนี้เชื่อมต่อกับตัวดำเนินการ Sobel ของขอบแนวตั้งซึ่งแสดงไว้ด้านล่าง -
ทิศทางแนวตั้ง
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
ภาพที่ได้รับการแก้ไข (ทิศทางแนวตั้ง)
ต้นฉบับนี้ได้รับการแก้ไขด้วยตัวดำเนินการ Sobel ของขอบแนวนอนซึ่งได้รับด้านล่าง -
ทิศทางแนวนอน
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
ภาพที่ได้รับการแก้ไข (ทิศทางแนวนอน)
หน้ากากเข็มทิศ Kirsch เป็นหน้ากากอนุพันธ์อีกประเภทหนึ่งซึ่งใช้สำหรับการตรวจจับขอบ ตัวดำเนินการนี้เรียกอีกอย่างว่าหน้ากากทิศทาง ในโอเปอเรเตอร์นี้เราใช้หน้ากากหนึ่งอันแล้วหมุนไปตามทิศทางของเข็มทิศทั้งแปดเพื่อให้ได้ขอบของทั้งแปดทิศทาง
เรากำลังจะใช้ OpenCV ฟังก์ชัน filter2Dเพื่อใช้ตัวดำเนินการ Kirsch กับรูปภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | การโต้เถียง |
---|---|
1 | src เป็นภาพต้นฉบับ |
2 | dst เป็นภาพปลายทาง |
3 | depth มันคือความลึกของ dst ค่าลบ (เช่น -1) บ่งชี้ว่าความลึกเหมือนกับแหล่งที่มา |
4 | kernel เป็นเคอร์เนลที่จะสแกนผ่านภาพ |
5 | anchor เป็นตำแหน่งของจุดยึดที่สัมพันธ์กับเคอร์เนล ตำแหน่งจุด (-1, -1) ระบุจุดศูนย์กลางตามค่าเริ่มต้น |
6 | delta เป็นค่าที่จะเพิ่มให้กับแต่ละพิกเซลระหว่างการแปลง โดยค่าเริ่มต้นจะเป็น 0 |
7 | BORDER_DEFAULT เราปล่อยให้ค่านี้เป็นค่าเริ่มต้น |
นอกเหนือจากเมธอด filter2D () แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้ตัวดำเนินการ Kirsch กับอิมเมจของ 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,-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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพต้นฉบับนี้เชื่อมโยงกับตัวดำเนินการ Kirsch ของ East edge ซึ่งแสดงไว้ด้านล่าง -
เคิร์ชตะวันออก
-3 | -3 | -3 |
-3 | 0 | -3 |
5 | 5 | 5 |
ภาพที่ได้รับการแก้ไข (Kirsch East)
ภาพต้นฉบับนี้เชื่อมโยงกับตัวดำเนินการ Kirsch ของขอบตะวันตกเฉียงใต้ซึ่งตามที่ระบุด้านล่าง -
เคิร์ชทางตะวันตกเฉียงใต้
5 | 5 | -3 |
5 | 0 | -3 |
-3 | -3 | -3 |
ภาพที่ได้รับการแก้ไข (Kirsch South West)
หน้ากากโรบินสันเป็นอีกประเภทหนึ่งของมาสก์อนุพันธ์ที่ใช้สำหรับการตรวจจับขอบ ตัวดำเนินการนี้เรียกอีกอย่างว่าหน้ากากทิศทาง ในตัวดำเนินการนี้เราใช้หน้ากากหนึ่งอันแล้วหมุนไปในทิศทางหลักทั้งแปดเพื่อให้ได้ขอบของทั้งแปดทิศทาง
เรากำลังจะใช้ OpenCV ฟังก์ชัน filter2Dเพื่อใช้ผู้ประกอบการโรบินสันกับรูปภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | src เป็นภาพต้นฉบับ |
2 | dst เป็นภาพปลายทาง |
3 | depth มันคือความลึกของ dst ค่าลบ (เช่น -1) บ่งชี้ว่าความลึกเหมือนกับแหล่งที่มา |
4 | kernel เป็นเคอร์เนลที่จะสแกนผ่านภาพ |
5 | anchor เป็นตำแหน่งของจุดยึดที่สัมพันธ์กับเคอร์เนล ตำแหน่งจุด (-1, -1) ระบุจุดศูนย์กลางตามค่าเริ่มต้น |
6 | delta เป็นค่าที่จะเพิ่มให้กับแต่ละพิกเซลระหว่างการแปลง โดยค่าเริ่มต้นจะเป็น 0 |
7 | BORDER_DEFAULT เราปล่อยให้ค่านี้เป็นค่าเริ่มต้น |
นอกเหนือจากเมธอด filter2D แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้ตัวดำเนินการ Robinson กับรูปภาพของ 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,-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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพต้นฉบับนี้เชื่อมโยงกับตัวดำเนินการของ Robinson of North edge ตามที่ระบุด้านล่าง -
หน้ากากทิศเหนือ
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
Convolved Image (โรบินสันเหนือ)
ภาพต้นฉบับนี้ได้รับการแก้ไขร่วมกับผู้ดำเนินการ Robinson แห่ง East edge ตามที่ระบุด้านล่าง -
หน้ากากทิศตะวันออก
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
Convolved Image (โรบินสันตะวันออก)
Laplacian Operator ยังเป็นตัวดำเนินการอนุพันธ์ที่ใช้ในการหาขอบในภาพ ความแตกต่างที่สำคัญระหว่าง Laplacian กับตัวดำเนินการอื่น ๆ เช่น Prewitt, Sobel, Robinson และ Kirsch คือสิ่งเหล่านี้เป็นมาสก์อนุพันธ์ลำดับที่หนึ่ง แต่ Laplacian เป็นมาสก์อนุพันธ์อันดับสอง
เราใช้ OpenCV ฟังก์ชัน filter2Dเพื่อใช้ตัวดำเนินการ Laplacian กับรูปภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | อาร์กิวเมนต์ |
---|---|
1 | src เป็นภาพต้นฉบับ |
2 | dst เป็นภาพปลายทาง |
3 | depth มันคือความลึกของ dst ค่าลบ (เช่น -1) บ่งชี้ว่าความลึกเหมือนกับแหล่งที่มา |
4 | kernel เป็นเคอร์เนลที่จะสแกนผ่านภาพ |
5 | anchor เป็นตำแหน่งของจุดยึดที่สัมพันธ์กับเคอร์เนล ตำแหน่งจุด (-1, -1) ระบุจุดศูนย์กลางตามค่าเริ่มต้น |
6 | delta เป็นค่าที่จะเพิ่มให้กับแต่ละพิกเซลระหว่างการแปลง โดยค่าเริ่มต้นจะเป็น 0 |
7 | BORDER_DEFAULT เราปล่อยให้ค่านี้เป็นค่าเริ่มต้น |
นอกเหนือจากเมธอด filter2D () แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้ตัวดำเนินการ Laplacian กับรูปภาพของ 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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพต้นฉบับนี้เชื่อมต่อกับตัวดำเนินการ Laplacian Negative ตามที่ระบุด้านล่าง -
Laplacian Negative
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
ภาพที่ได้รับการแก้ไข (Laplacian Negative)
ภาพต้นฉบับนี้เชื่อมต่อกับตัวดำเนินการ Laplacian Positive ตามที่ระบุด้านล่าง -
Laplacian Positive
0 | 1 | 0 |
1 | -4 | 1 |
0 | 1 | 0 |
ภาพที่ได้รับการแก้ไข (Laplacian Positive)
ในตัวกรองค่าเฉลี่ยถ่วงน้ำหนักเราให้น้ำหนักกับค่าศูนย์มากขึ้นเนื่องจากการมีส่วนร่วมของศูนย์มากกว่าค่าที่เหลือ เนื่องจากการกรองแบบถัวเฉลี่ยถ่วงน้ำหนักเราสามารถควบคุมความเบลอของภาพได้
เราใช้ OpenCV ฟังก์ชัน filter2Dเพื่อใช้ฟิลเตอร์ถัวเฉลี่ยถ่วงน้ำหนักกับรูปภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
อาร์กิวเมนต์ของฟังก์ชันอธิบายไว้ด้านล่าง -
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | src เป็นภาพต้นฉบับ |
2 | dst เป็นภาพปลายทาง |
3 | ddepth มันคือความลึกของ dst ค่าลบ (เช่น -1) บ่งชี้ว่าความลึกเหมือนกับแหล่งที่มา |
4 | kernel เป็นเคอร์เนลที่จะสแกนผ่านภาพ |
5 | anchor เป็นตำแหน่งของจุดยึดที่สัมพันธ์กับเคอร์เนล ตำแหน่งจุด (-1, -1) ระบุจุดศูนย์กลางตามค่าเริ่มต้น |
6 | delta เป็นค่าที่จะเพิ่มให้กับแต่ละพิกเซลระหว่างการแปลง โดยค่าเริ่มต้นจะเป็น 0 |
7 | BORDER_DEFAULT เราปล่อยให้ค่านี้เป็นค่าเริ่มต้น |
นอกเหนือจากเมธอด filter2D () แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้ตัวกรองค่าเฉลี่ยถ่วงน้ำหนักกับรูปภาพของ 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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพต้นฉบับนี้เชื่อมต่อกับตัวกรองค่าเฉลี่ยถ่วงน้ำหนักตามที่ระบุด้านล่าง -
ตัวกรองเฉลี่ยถ่วงน้ำหนัก
1 | 1 | 1 |
1 | 10 | 1 |
1 | 1 | 1 |
ภาพที่ได้รับการแก้ไข
การซูมเป็นกระบวนการขยายภาพเพื่อให้รายละเอียดในภาพสามารถมองเห็นได้ชัดเจนและโดดเด่นมากขึ้น
เราใช้ OpenCV ฟังก์ชัน resizeเพื่อใช้การซูมภาพ สามารถดูได้ที่ด้านล่างImgprocแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -
Imgproc.resize(source,destination, destination.size(),zoomFactor,zoomFactor,Interpolation);
ในฟังก์ชั่นปรับขนาดเราจะส่งอิมเมจต้นทางรูปภาพปลายทางและขนาดของมันปัจจัยการซูมและวิธีการแก้ไขที่จะใช้
วิธีการแก้ไขที่มีอยู่มีอธิบายไว้ด้านล่าง -
ซีเนียร์ | วิธีการแก้ไขและคำอธิบาย |
---|---|
1 | INTER_NEAREST เป็นการแก้ไขเพื่อนบ้านที่ใกล้ที่สุด |
2 | INTER_LINEAR เป็นการแก้ไขทวิภาคี (ใช้โดยค่าเริ่มต้น) |
3 | INTER_AREA เป็นการสุ่มตัวอย่างใหม่โดยใช้ความสัมพันธ์ของพื้นที่พิกเซล อาจเป็นวิธีที่ดีกว่าสำหรับการลดขนาดรูปภาพเนื่องจากให้ผลลัพธ์ที่อิสระมากกว่า |
4 | INTER_CUBIC เป็นการแก้ไขแบบสองลูกบาศก์ในย่านพิกเซล 4x4 |
5 | INTER_LANCZOS4 เป็นการแก้ไข Lanczos ในย่าน 8x8 พิกเซล |
นอกเหนือจากวิธีการปรับขนาดแล้วยังมีวิธีการอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อใช้การย่อ / ขยายภาพ
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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -
ภาพต้นฉบับ
ภาพที่ซูม (ปัจจัยการซูม - 2)
ในบทนี้เราจะสำรวจไลบรารีการประมวลผลภาพฟรีบางส่วนที่ใช้กันอย่างแพร่หลายและสามารถรวมเข้ากับโครงการได้อย่างง่ายดาย ห้องสมุดเหล่านี้ ได้แก่ -
- ImageJ
- Fiji
- การถ่ายภาพทั่วไป
- ImageMagick
- Endrov
- LeadTools
- OpenCv
อิมเมจจ
ImageJ เป็นโปรแกรมประมวลผลรูปภาพ Java โดเมนสาธารณะที่ได้รับแรงบันดาลใจจาก NIH Image สำหรับ Macintosh สามารถแสดงแก้ไขวิเคราะห์ประมวลผลบันทึกและพิมพ์ภาพ 8 บิต 16 บิตและ 32 บิต
คุณสมบัติพื้นฐานบางประการของ ImageJ มีอธิบายไว้ด้านล่าง -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | Runs Everywhere ImageJ เขียนด้วย Java ซึ่งอนุญาตให้ทำงานบน Linux, Mac OS X และ Windows ทั้งในโหมด 32 บิตและ 64 บิต |
2 | Open Source ImageJ และซอร์สโค้ด Java สามารถใช้ได้อย่างอิสระและเป็นสาธารณสมบัติ |
3 | Toolkit ใช้ ImageJ เป็นชุดเครื่องมือการประมวลผลภาพ (ไลบรารีคลาส) เพื่อพัฒนาแอพเพล็ต servlets หรือแอปพลิเคชัน |
4 | Data Types สีเทาหรือสีที่จัดทำดัชนี 8 บิตจำนวนเต็มไม่ได้ลงนาม 16 บิตจุดลอยตัว 32 บิตและสี RGB |
5 | File Formats เปิดและบันทึก GIF, JPEG, BMP, PNG, PGM, FITS และ ASCII เปิด DICOM เปิด TIFFs, GIFs, JPEGs, DICOMs และข้อมูลดิบโดยใช้ URL |
6 | Selections สร้างการเลือกพื้นที่รูปสี่เหลี่ยมผืนผ้ารูปไข่หรือไม่สม่ำเสมอ สร้างการเลือกเส้นและจุด |
7 | Image Enhancement รองรับการปรับให้เรียบ, ความคมชัด, การตรวจจับขอบ, การกรองค่ามัธยฐานและการกำหนดขีด จำกัด สำหรับภาพสีเทา 8 บิตและ RGB |
8 | Color Processing แยกภาพสี 32 บิตเป็นส่วนประกอบ RGB หรือ HSV ผสานส่วนประกอบ 8 บิตลงในภาพสี |
ฟิจิ
ฟิจิเป็นแพ็คเกจการประมวลผลภาพ สามารถอธิบายได้ว่าเป็นการกระจาย ImageJ (และ ImageJ2) ร่วมกับ Java, Java3D และปลั๊กอินจำนวนมากที่จัดเป็นโครงสร้างเมนูที่สอดคล้องกัน ฟิจิเปรียบเทียบกับ ImageJ เมื่อ Ubuntu เปรียบเทียบกับ Linux
นอกเหนือจากคุณสมบัติพื้นฐานของ ImageJ แล้วคุณสมบัติขั้นสูงบางอย่างของฟิจิมีอธิบายไว้ด้านล่าง -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | Registering 3D images สิ่งนี้เกี่ยวข้องกับการจัดตำแหน่งและการตัดต่อแบบยืดหยุ่นการแยกคุณลักษณะการป้องกันภาพสั่นไหวเป็นต้น |
2 | Segmenting images มีการแบ่งกลุ่มมากกว่า 35 ประเภท |
3 | Useful keyboard short cuts ฟูจิมีแป้นพิมพ์ลัดมากมาย |
4 | Scripting อนุญาตให้เขียนสคริปต์ด้วยมาโครใน JavaScript, JRuby, Jython, Clojure และ Beanshell |
5 | Developing Plug-ins ใช้ Script Editor เพื่อเริ่มการพัฒนาปลั๊กอินจากนั้นเรียกใช้ปลั๊กอิน |
6 | ImageJ Tricks ImageJ ใช้งานง่าย แต่บางครั้งคุณต้องการฟังก์ชั่นบางอย่างที่ใช้งานได้จริง แต่คุณไม่รู้วิธีเรียกใช้ |
การถ่ายภาพทั่วไป
Apache Commons Imaging ก่อนหน้านี้รู้จักกันในชื่อ Apache Commons Sanselan เป็นไลบรารีที่อ่านและเขียนรูปแบบภาพที่หลากหลายรวมถึงการแยกวิเคราะห์ข้อมูลภาพอย่างรวดเร็วเช่น (ขนาดสีพื้นที่โปรไฟล์ ICC ฯลฯ ) และข้อมูลเมตา
คุณสมบัติพื้นฐานบางประการของ ImageJ มีอธิบายไว้ด้านล่าง -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | Java Apache Commons Imaging เขียนด้วย Java แท้ 100% ดำเนินการบน JVM และแพลตฟอร์มใด ๆ โดยไม่ต้องดัดแปลง |
2 | Image Formats มันอ่านและเขียนรูปแบบภาพที่หลากหลายและรองรับรูปแบบและการเข้ารหัสบางอย่างที่ไม่ได้รับจากไลบรารีอื่น ๆ ทั้งหมดหรือเกือบทั้งหมด |
3 | Metadata support รองรับการอ่านและเขียนข้อมูลเมตาที่หลากหลายในรูปแบบที่มีโครงสร้างรวมถึงข้อมูลเมตา EXIF |
4 | Network Friendly เป็นมิตรกับเครือข่าย Commons Imaging จะอ่านเฉพาะข้อมูลที่ต้องการและแคชสิ่งที่อ่านเพื่อไม่ให้หนักเกินไปในเครือข่าย |
5 | Easy to use ถูกออกแบบมาให้ใช้งานง่ายมาก มีอินเทอร์เฟซที่เรียบง่ายและสะอาดตา การดำเนินการส่วนใหญ่เป็นการเรียกวิธีการสร้างภาพเพียงครั้งเดียว |
6 | Transparent Commons Imaging มีจุดมุ่งหมายเพื่อความโปร่งใส ไม่มีบัฟเฟอร์ที่ซ่อนอยู่ให้กำจัดไม่มีหน่วยความจำดั้งเดิมให้ว่างไม่มีเธรดพื้นหลัง |
7 | Open Source เป็นซอฟต์แวร์ฟรี / โอเพ่นซอร์ส สามารถใช้ได้ภายใต้ใบอนุญาตซอฟต์แวร์ Apache |
8 | Color Conversions คลาส ColorConversions มีวิธีการแปลงระหว่างช่องว่างสีต่อไปนี้ - CIE-L * CH, CIE-L * ab, CIE-L * uv, CMY, CMYK, HSL, HSV, Hunter-Lab, RGB, XYZ และ YXY |
ImageMagick
ImageMagick เป็นชุดซอฟต์แวร์สำหรับสร้างแก้ไขแต่งหรือแปลงภาพบิตแมป สามารถอ่านและเขียนภาพได้มากกว่า 100 รูปแบบ ได้แก่ DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PNG, Postscript, SVG และ TIFF ใช้ ImageMagick เพื่อปรับขนาดพลิกกระจกหมุนบิดเบือนเฉือนและแปลงภาพปรับสีของภาพใช้เทคนิคพิเศษต่างๆหรือวาดข้อความเส้นรูปหลายเหลี่ยมจุดไข่ปลาและเส้นโค้ง Bezier
คุณสมบัติพื้นฐานบางประการของ ImageMagick มีอธิบายไว้ด้านล่าง -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | Format conversion จะแปลงภาพจากรูปแบบหนึ่งไปเป็นอีกรูปแบบหนึ่ง (เช่น PNG เป็น JPEG) |
2 | Transform สามารถปรับขนาดหมุนครอบตัดพลิกหรือตัดแต่งภาพ |
3 | Transparency มันทำให้บางส่วนของภาพที่มองไม่เห็น |
4 | Draw เพิ่มรูปร่างหรือข้อความให้กับรูปภาพ |
5 | Decorate เพิ่มเส้นขอบหรือกรอบให้กับรูปภาพ |
6 | Special effects สามารถเบลอเพิ่มความคมชัดขีด จำกัด หรือย้อมสีภาพได้ |
7 | Animation สามารถสร้างลำดับภาพเคลื่อนไหว GIF จากกลุ่มภาพ |
8 | Composite มันสามารถซ้อนภาพหนึ่งทับอีกภาพหนึ่งได้ |
9 | Morphology of shapes มันแยกคุณสมบัติอธิบายรูปร่างและจดจำรูปแบบในภาพ |
10 | Encipher or decipher an image มันแปลงภาพธรรมดาให้กลายเป็นคำพูดพล่อยๆที่ไม่เข้าใจและกลับมาอีกครั้ง |
Endrov
Endrov คือโปรแกรมวิเคราะห์ภาพเอนกประสงค์ เขียนขึ้นโดยอิสระและออกแบบมาเพื่อแก้ไขข้อบกพร่องหลายประการของซอฟต์แวร์เสรีอื่น ๆ และแพ็คเกจเชิงพาณิชย์จำนวนมาก
คุณสมบัติพื้นฐานบางประการของ Endrov มีการอธิบายไว้ด้านล่าง -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | View data ดูข้อมูลในรูปแบบ 2 มิติและ 3 มิติ ออกแบบมาเพื่อจัดการกับโครงร่างข้อมูล 4D ที่ซับซ้อนและไม่ จำกัด จำนวนช่องโดยแต่ละช่องจะมีความละเอียด X, Y และ Z ของตัวเอง |
2 | Annotate your images มันใส่คำอธิบายประกอบภาพของคุณโดยอัตโนมัติหรือด้วยมือเพื่อทำความเข้าใจและรับสถิติ |
3 | Undo and Redo สามารถเลิกทำและทำซ้ำสำหรับการดำเนินการทั้งหมด |
4 | Lazy Evaluation ได้รับการออกแบบจากพื้นดินเพื่อรองรับชุดภาพขนาดใหญ่ Endrov ใช้การประเมินแบบขี้เกียจซึ่งเป็นแนวคิดที่มีอยู่ในภาษาโปรแกรมการวิจัยเป็นส่วนใหญ่ |
5 | Scripting language รองรับภาษาสคริปต์แบบกราฟิกเช่นเดียวกับการเขียนสคริปต์แบบดั้งเดิม |
6 | Java เขียนด้วยภาษาจาวา สถาปัตยกรรมปลั๊กอินช่วยให้สามารถขยายได้ง่ายด้วยปลั๊กอิน Java ใหม่ มันสามารถโต้ตอบกับ Matlab |
7 | Formats เข้าถึงรูปแบบไฟล์เชิงพาณิชย์และแบบเปิดเกือบทั้งหมดโดยใช้รูปแบบไบโอ |
8 | Microscopic Processing สามารถควบคุมกล้องจุลทรรศน์ทั้งหมดของคุณด้วยโปรแกรมเดียวและทำการวิเคราะห์ภาพได้ทันที |
LEADTOOLS
LEADTOOLS มีฟังก์ชันการประมวลผลภาพมากกว่า 200 รายการในหลายประเภทรวมถึงการล้างเอกสารการปรับปรุงภาพทางการแพทย์การแปลงสีและการแก้ไขการลดสัญญาณรบกวนการตรวจจับขอบและอื่น ๆ
คุณสมบัติพื้นฐานบางประการของ LEADTOOLS มีอธิบายไว้ด้านล่าง -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | Scanned Document Image Processing ชุดฟังก์ชันที่มีประสิทธิภาพนี้สามารถอ่านเอกสารที่สแกนของสิ่งประดิษฐ์และความไม่สมบูรณ์เช่นรูที่เจาะมุมเอียงขอบจุดฝุ่นและอื่น ๆ |
2 | Medical Image Processing ปรับปรุงรูปภาพหรือเน้นรายละเอียดโดยการเลื่อนเลือกลบและลบพื้นหลังเพื่อให้ได้ภาพที่ดีขึ้น |
3 | Geometric Transformation ฟังก์ชันเหล่านี้สามารถใช้เพื่อทำความสะอาดจัดแนวแก้ไขภาพหรือใช้เอฟเฟกต์ 3D เชิงศิลปะ |
4 | Brightness and Contrast ฟังก์ชันเหล่านี้สามารถใช้เพื่อปรับปรุงภาพใช้เอฟเฟ็กต์ทางศิลปะหรือช่วยในการประเมินผลการวินิจฉัยภาพทางการแพทย์ |
5 | Color Space Conversion พวกเขาสามารถเพิ่มฟังก์ชันพื้นที่สีของภาพให้กับแอปพลิเคชันเดียวและหลายเธรดรวมถึงแอปพลิเคชันที่โฮสต์ IIS และ Windows WF |
6 | Color Correction ฟังก์ชันเหล่านี้ใช้เพื่อแก้ไขภาพที่มีการสลับช่องสีปรับสมดุลความเข้มของสีหรือดำเนินการวิเคราะห์ภาพต่างๆ |
7 | Image Enhancement ฟังก์ชันเหล่านี้ใช้เพื่อแก้ไขข้อผิดพลาดทั่วไปในการถ่ายภาพเช่นตาแดงและสีที่ไม่สมดุลรวมทั้งช่วยในการประเมินการวินิจฉัยภาพทางการแพทย์ |
8 | Region of Interest ฟังก์ชันเหล่านี้ใช้เพื่อสร้างและปรับเปลี่ยนพื้นที่ที่สนใจในรูปภาพเพื่อทำหน้าที่ประมวลผลภาพในบางส่วนของรูปภาพประหยัดเวลาในบาร์โค้ดและการจดจำ OCR หรือดำเนินการวิเคราะห์รูปภาพ |
OpenCV
OpenCV ได้รับการเผยแพร่ภายใต้ใบอนุญาต BSD และด้วยเหตุนี้จึงฟรีสำหรับการใช้งานเชิงวิชาการและเชิงพาณิชย์ มีอินเตอร์เฟส C ++, C, Python และ Java และรองรับ Windows, Linux, Mac OS, iOS และ Android OpenCV ได้รับการออกแบบมาเพื่อประสิทธิภาพในการคำนวณและเน้นการใช้งานแบบเรียลไทม์ เขียนด้วย C / C ++ ที่ปรับให้เหมาะสมไลบรารีสามารถใช้ประโยชน์จากการประมวลผลแบบมัลติคอร์
คุณสมบัติพื้นฐานบางประการของ OpenCV อธิบายสั้น ๆ -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | Smoothing Images สิ่งนี้เกี่ยวข้องกับการใช้ Blur, GaussianBlur, medianBlur และ bilateral Filter |
2 | Eroding and Dilating สามารถใช้ตัวดำเนินการทางสัณฐานวิทยาที่พบได้ทั่วไปสองตัว ได้แก่ การขยายและการพังทลาย |
3 | Morphology Transformations OpenCV function morphologyEx เพื่อใช้การเปลี่ยนแปลงทางสัณฐานวิทยาเช่นการเปิดปิด TopHat และ BlackHat เป็นต้น |
4 | Image Pyramids ฟังก์ชัน OpenCV pyrUp และ pyrDown เพื่อลงตัวอย่างหรืออัพตัวอย่างภาพที่กำหนด |
4 | Basic Thresholding Operations ดำเนินการขีด จำกัด พื้นฐานโดยใช้ขีด จำกัด ฟังก์ชัน OpenCV |
5 | Adding borders to your images ฟังก์ชัน OpenCV copyMakeBorder ใช้เพื่อกำหนดเส้นขอบ (ช่องว่างเพิ่มเติมให้กับรูปภาพของคุณ) |
7 | Remapping ใน OpenCV การรีแมปฟังก์ชันนำเสนอการใช้งานการรีแมปอย่างง่าย |
8 | Histogram Calculation เพื่อวัตถุประสงค์ง่ายๆ OpenCV ใช้ฟังก์ชัน calcHist ซึ่งจะคำนวณฮิสโตแกรมของชุดอาร์เรย์ (โดยปกติจะเป็นภาพหรือระนาบภาพ) สามารถทำงานได้ถึง 32 มิติ |
OpenCV ได้รับการเผยแพร่ภายใต้ใบอนุญาต BSD และด้วยเหตุนี้จึงฟรีสำหรับการใช้งานเชิงวิชาการและเชิงพาณิชย์ มีอินเตอร์เฟส C ++, C, Python และ Java และรองรับ Windows, Linux, Mac OS, iOS และ Android
OpenCV ได้รับการออกแบบมาเพื่อประสิทธิภาพในการคำนวณและเน้นการใช้งานแบบเรียลไทม์ เขียนด้วย C / C ++ ที่ปรับให้เหมาะสมไลบรารีสามารถใช้ประโยชน์จากการประมวลผลแบบมัลติคอร์
คุณสมบัติพื้นฐานบางประการของ OpenCV มีการอธิบายไว้ด้านล่าง -
ซีเนียร์ | คุณสมบัติและคำอธิบาย |
---|---|
1 | Smoothing Images สิ่งนี้เกี่ยวข้องกับการใช้ Blur, GaussianBlur, medianBlur และตัวกรองทวิภาคี |
2 | Eroding and Dilating สามารถใช้ตัวดำเนินการทางสัณฐานวิทยาที่พบได้ทั่วไปสองตัว ได้แก่ การขยายและการพังทลาย |
3 | Morphology Transformations OpenCV function morphologyEx เพื่อใช้การเปลี่ยนแปลงทางสัณฐานวิทยาเช่นการเปิดปิด TopHat และ BlackHat เป็นต้น |
4 | Image Pyramids ฟังก์ชัน OpenCV pyrUp และ pyrDown เพื่อลงตัวอย่างหรืออัพตัวอย่างภาพที่กำหนด |
4 | Basic Thresholding Operations สามารถดำเนินการขีด จำกัด พื้นฐานโดยใช้เกณฑ์ฟังก์ชัน OpenCV |
5 | Adding borders to your images ฟังก์ชัน OpenCV copyMakeBorder ใช้เพื่อกำหนดเส้นขอบ (ช่องว่างเพิ่มเติมให้กับรูปภาพของคุณ) |
7 | Remapping ใน OpenCV การรีแมปฟังก์ชันนำเสนอการใช้งานการรีแมปอย่างง่าย |
8 | Histogram Calculation เพื่อวัตถุประสงค์ง่ายๆ OpenCV ใช้ฟังก์ชัน calcHist ซึ่งจะคำนวณฮิสโตแกรมของชุดอาร์เรย์ (โดยปกติจะเป็นภาพหรือระนาบภาพ) สามารถทำงานได้ถึง 32 มิติ |
การรวม OpenCV
ขั้นตอนต่อไปนี้อธิบายวิธีการรวม OpenCV เข้ากับแอปพลิเคชันของคุณ
ดาวน์โหลด OpenCV
คุณสามารถดาวน์โหลด OpenCV จากเว็บไซต์อย่างเป็นทางการของพวกเขาที่นี่
สร้างไลบรารีผู้ใช้
นอกจากนี้เรายังสร้างไลบรารีผู้ใช้ของ OpenCV เพื่อให้เราสามารถใช้เป็นโครงการในอนาคตได้
เปิด Eclipse
เลือก Window -> Preferences จากเมนู
ไปที่ใต้ Java -> Build Path -> User Libraries แล้วคลิก New
ตอนนี้ป้อนชื่อห้องสมุดของคุณ ตัวอย่างเช่น OpenCV-2.4.6
หลังจากนั้นเลือกไลบรารีผู้ใช้ใหม่ของคุณ (เช่น OpenCV-2.4.6) และคลิกที่ Add External JARs
เรียกดู C: \ OpenCV-2.4.6 \ build \ java \ และเลือก opencv-246.jar หลังจากเพิ่ม jar แล้วให้ขยาย opencv-246.jar แล้วเลือกตำแหน่งไลบรารีดั้งเดิมแล้วกดแก้ไข
เลือกโฟลเดอร์ภายนอก ... และเรียกดูเพื่อเลือกโฟลเดอร์ C: \ OpenCV-2.4.6 \ build \ java \ x64 หากคุณมีระบบ 32 บิตคุณต้องเลือกโฟลเดอร์ x86 แทน x64
กด Ok เท่านี้ก็เสร็จแล้ว
ตอนนี้ห้องสมุดผู้ใช้ของคุณถูกสร้างขึ้น ตอนนี้คุณสามารถใช้การกำหนดค่านี้ซ้ำในโครงการใดก็ได้
สร้างโครงการ OpenCV
สร้างโปรเจ็กต์ java ใหม่ใน eclipse
ในขั้นตอนการตั้งค่า Java ภายใต้แท็บไลบรารีเลือกเพิ่มไลบรารี ... และเลือก OpenCV-2.4.6 จากนั้นคลิกเสร็จสิ้น
คลิกเสร็จสิ้นและเสร็จสิ้น
ในการแปลงภาพสีเป็นภาพระดับสีเทาโดยใช้ OpenCV เราจะอ่านภาพเป็นไฟล์ BufferedImage และแปลงเป็นไฟล์ Matวัตถุ. ไวยากรณ์ได้รับด้านล่าง -
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
จากนั้นคุณสามารถแปลงภาพจาก RGB เป็นรูปแบบ Grayscale โดยใช้วิธีการ cvtColor() ใน Imgprocชั้นเรียน. ไวยากรณ์ได้รับด้านล่าง -
Imgproc.cvtColor(source mat, destination mat1, Imgproc.COLOR_RGB2GRAY);
วิธีการ cvtColor() รับพารามิเตอร์สามตัวซึ่ง ได้แก่ เมทริกซ์อิมเมจต้นทางเมทริกซ์รูปภาพปลายทางและประเภทการแปลงสี
นอกเหนือจากเมธอด cvtColor แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc ตามรายการด้านล่าง -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อแปลงรูปภาพเป็น 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());
}
}
}
เอาต์พุต
เมื่อคุณดำเนินการตามตัวอย่างที่กำหนดมันจะแปลงชื่อภาพ digital_image_processing.jpg ให้เทียบเท่ากับภาพ Grayscale และเขียนลงบนฮาร์ดดิสก์ด้วยชื่อ grayscale.jpg.
ภาพต้นฉบับ
ภาพระดับสีเทา
ในการเปลี่ยนพื้นที่สีของภาพหนึ่งไปเป็นอีกภาพหนึ่งโดยใช้ OpenCV เราจะอ่านภาพเป็น BufferedImage และแปลงเป็นไฟล์ Matวัตถุ. ไวยากรณ์ได้รับด้านล่าง -
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
OpenCv ช่วยให้สามารถแปลงสีได้หลายประเภทซึ่งทั้งหมดนี้สามารถพบได้ในคลาส Imgproc บางประเภทมีการอธิบายสั้น ๆ -
ซีเนียร์ | ประเภทการแปลงสี |
---|---|
1 | COLOR_RGB2BGR |
2 | COLOR_RGB2BGRA |
3 | COLOR_RGB2GRAY |
4 | COLOR_RGB2HLS |
5 | COLOR_RGB2HSV |
6 | COLOR_RGB2Luv |
7 | COLOR_RGB2YUV |
8 | COLOR_RGB2Lab |
จากประเภทการแปลงสีใด ๆ เพียงแค่ส่งชนิดที่เหมาะสมลงในวิธีการ cvtColor() ใน Imgprocชั้นเรียน. ไวยากรณ์ได้รับด้านล่าง -
Imgproc.cvtColor(source mat, destination mat1, Color_Conversion_Code);
วิธีการ cvtColor() รับพารามิเตอร์สามตัวซึ่ง ได้แก่ เมทริกซ์รูปภาพต้นทางเมทริกซ์รูปภาพปลายทางและประเภทการแปลงสี
นอกเหนือจากเมธอด cvtColor () แล้วยังมีเมธอดอื่น ๆ ที่จัดเตรียมโดยคลาส Imgproc มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) จะแปลงภาพจากพื้นที่สีหนึ่งไปเป็นอีกพื้นที่หนึ่ง |
2 | dilate(Mat src, Mat dst, Mat kernel) ขยายภาพโดยใช้องค์ประกอบโครงสร้างเฉพาะ |
3 | equalizeHist(Mat src, Mat dst) มันทำให้ฮิสโตแกรมของภาพสีเทาเท่ากัน |
4 | filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) มันแปลงภาพด้วยเคอร์เนล |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) ภาพเบลอโดยใช้ฟิลเตอร์ Gaussian |
6 | integral(Mat src, Mat sum) คำนวณอินทิกรัลของรูปภาพ |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส Imgproc เพื่อแปลงรูปภาพจากปริภูมิสีหนึ่งไปยังอีกที่หนึ่ง
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());
}
}
}
เอาต์พุต
เมื่อคุณดำเนินการตามตัวอย่างที่กำหนดมันจะแปลงชื่อภาพ digital_image_processing.jpg เป็นอิมเมจพื้นที่สี HSV ที่เทียบเท่าและเขียนลงบนฮาร์ดดิสก์พร้อมชื่อ hsv.jpg.