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)

มันคำนวณพื้นที่สี่เหลี่ยมโดยพลการของ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()

มันส่งคืนประเภทรูปภาพ

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้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.

ภาพต้นฉบับ (RGB)

ภาพที่แปลงแล้ว (HSV)