JavaDIP-クイックガイド

デジタル画像処理(DIP)は、デジタルコンピュータを使用したデジタル画像の操作を扱います。これは信号とシステムのサブフィールドですが、特に画像に焦点を当てています。DIPは、画像の処理を実行できるコンピューターシステムの開発に重点を置いています。そのようなシステムの入力はデジタル画像です。システムは効率的なアルゴリズムを使用して画像を処理し、出力として画像を提供します。

Javaは、現代の世界で広く使用されている高級プログラミング言語です。さまざまな機能を利用して、デジタル画像処理を効率的にサポート・処理できます。

JavaBufferedImageクラスはImageクラスのサブクラスです。画像データの処理と操作に使用されます。ABufferedImageは画像データのColorModelでできています。すべてのBufferedImageオブジェクトの左上隅の座標は(0、0)です。

コンストラクター

このクラスは、3種類のコンストラクターをサポートします。

最初のコンストラクターはBufferedImage、指定されたColorModelとRasterを使用してnewを作成します。

BufferedImage(ColorModel cm, WritableRaster raster, 
boolean isRasterPremultiplied, Hashtable<?,?> properties)

2番目のコンストラクターBufferedImageは、事前定義されたイメージタイプの1つを構築します。

BufferedImage(int width, int height, int imageType)

3番目のコンストラクターBufferedImageは、事前定義されたイメージタイプの1つであるTYPE_BYTE_BINARYまたはTYPE_BYTE_INDEXEDを構築します。

BufferedImage(int width, int height, int imageType, IndexColorModel cm)

シニア番号 方法と説明
1

copyData(WritableRaster outRaster)

の任意の長方形領域を計算BufferedImageし、指定されたWritableRasterにコピーします。

2

getColorModel()

画像のColorModelクラスのオブジェクトを返します。

3

getData()

画像を1つの大きなタイルとして返します。

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()

画像タイプを返します。

次の例は、BufferedImageGraphicsObjectを使用して画面にテキストを描画するJavaクラスの使用法を示しています。

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のホストを返します。

次の例は、JavaURLクラスを使用してインターネットから画像をダウンロードする方法を示しています。

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)

オフセットオフから始まるlenバイト数をストリームに書き込みます。

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);
   }
}

出力

クライアント側の出力

クライアントコードを実行すると、クライアント側に次の出力が表示されます-

サーバー側の出力

サーバーコードを実行すると、サーバー側に次の出力が表示されます-

画像を受信すると、サーバーは次のように画像を表示します-

画像には、ピクセルの2次元配列が含まれています。実際には、画像を構成するピクセルの値です。通常、画像はカラーまたはグレースケールである可能性があります。

Javaでは、BufferedImageクラスを使用して画像を処理します。あなたは電話する必要がありますgetRGB() の方法 BufferedImage ピクセルの値を取得するクラス。

ピクセル値の取得

ピクセル値は、次の構文を使用して受け取ることができます-

Color c = new Color(image.getRGB(j, i));

RGB値の取得

メソッド getRGB()行と列のインデックスをパラメータとして受け取り、適切なピクセルを返します。カラー画像の場合、(赤、緑、青)の3つの値を返します。それらは次のように取得できます-

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()

画像を1つの大きなタイルとして返します。

4

getData(Rectangle rect)

BufferedImageの任意の領域を計算して返します。

5

getGraphics()

このメソッドはGraphics2Dを返しますが、下位互換性のためにここにあります。

6

getHeight()

BufferedImageの高さを返します。

7

getMinX()

このBufferedImageの最小x座標を返します。

8

getMinY()

このBufferedImageの最小y座標を返します。

9

getRGB(int x, int y)

デフォルトのRGBカラーモデル(TYPE_INT_ARGB)とデフォルトのsRGB色空間で整数ピクセルを返します。

10

getType()

画像タイプを返します。

次の例は、サイズ(100 x 100)の画像のピクセルを表示するjavaBufferedImageクラスの使用法を示しています。

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

出力を下にスクロールすると、次のパターンが表示されます-

カラー画像をグレースケール画像に変換するには、を使用して画像のピクセルまたはデータを読み取る必要があります。 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);

これらの3つのメソッドとは別に、簡単に説明したように、Colorクラスで使用できる他のメソッドがあります。

シニア番号 方法と説明
1

brighter()

この色の明るいバージョンである新しい色を作成します。

2

darker()

この色の暗いバージョンである新しい色を作成します。

3

getAlpha()

0〜255の範囲のアルファコンポーネントを返します。

4

getHSBColor(float h, float s, float b)

HSBカラーモデルに指定された値に基づいてColorオブジェクトを作成します。

5

HSBtoRGB(float hue, float saturation, float brightness)

HSBモデルで指定されているように、色のコンポーネントをデフォルトのRGBモデルと同等の値のセットに変換します。

6

toString()

この色の文字列表現を返します。

最後のステップは、これら3つの値をすべて追加し、対応するピクセル値に再度設定することです。その構文を以下に示します-

int sum = red+green+blue;
Color newColor = new Color(sum,sum,sum);
image.setRGB(j,i,newColor.getRGB());

次の例は、画像をグレースケールに変換するJavaBufferedImageクラスの使用法を示しています。

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.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)

ガウスフィルターを使用して画像をぼかします。

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)

2つのベクトルの内積を計算します。

5

reshape(int cn)

データをコピーせずに、2Dマトリックスの形状やチャネル数を変更します。

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());
      }
   }
}

出力

指定されたコードを実行すると、次の出力が表示されます-

元の画像

強化された明るい画像(アルファ= 1&ベータ= 50)

強化された明るい画像(アルファ= 2&ベータ= 50)

この章では、ガウスフィルターを使用して画像の鮮明度を上げる方法を学びます。

最初に使用します OpenCV 関数 GaussianBlur。それは下にありますImgprocパッケージ。その構文を以下に示します-

Imgproc.GaussianBlur(source, destination, new Size(0,0), sigmaX);

パラメータについて簡単に説明します-

シニア番号 パラメータと説明
1

source

ソース画像です。

2

destination

行き先画像です。

3

Size

ガウスカーネルサイズです。

4

sigmaX

X方向のガウスカーネル標準偏差です。

さらに、 OpenCV 関数 addWeighted画像に画像透かしを適用します。それは下にありますCoreパッケージ。その構文を以下に示します-

Core.addWeighted(InputArray src1, alpha, src2, beta, gamma, OutputArray dst);

この関数のパラメータを以下に説明します-

シニア番号 パラメータと説明
1

src1

最初の入力配列です。

2

alpha

これは、最初の配列要素の重みです。

3

src2

これは、src1と同じサイズとチャネル番号の2番目の入力配列です。

4

Beta

これは、2番目の配列要素の重みです。

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)

ガウスフィルターを使用して画像をぼかします。

6

integral(Mat src, Mat sum)

画像の積分を計算します。

次の例は、ImgprocとCoreクラスを使用して画像にシャープネスを適用する方法を示しています。

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オブジェクトから、次の2つのメソッドを呼び出すことで圧縮を設定できます。 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()

ライターが書き込み中にゼロ以外のグリッドオフセットでタイリングを実行できる場合は、trueを返します。

2

getBitRate(float quality)

指定された品質レベルでの入力画像データの各ビットの出力データのビット数の推定値を示す浮動小数点数を返します。

3

getLocale()

現在設定されているロケールを返します。デフォルトのロケールのみがサポートされている場合はnullを返します。

4

isCompressionLossless()

現在の圧縮タイプが可逆圧縮を提供する場合、trueを返します。

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)

ガウスフィルターを使用して画像をぼかします。

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

出力画像のサイズです。デフォルトでは、Size((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)

ガウスフィルターを使用して画像をぼかします。

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画像

しきい値処理により、最も簡単な方法で画像のセグメンテーションを実現できます。画像セグメンテーションとは、各セットのピクセルがいくつかの共通の特性を持つように、画像全体をピクセルのセットに分割することを意味します。画像セグメンテーションは、オブジェクトとその境界を定義するのに非常に役立ちます。

この章では、画像に対していくつかの基本的なしきい値処理を実行します。

を使用しております 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)

ガウスフィルターを使用して画像をぼかします。

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());
      }
   }
}

出力

指定されたコードを実行すると、次の出力が表示されます-

元の画像

上記の元の画像では、いくつかのしきい値処理が実行されます。これは、以下の出力に示されています。

スレッシュバイナリ

スレッシュバイナリ反転

スレッシュゼロ

OpenCVを使用すると、画像の形状を簡単に変更できます。画像は、4方向のいずれかに反転、拡大縮小、または回転することができます。

画像の形状を変更するために、画像を読み取り、Matオブジェクトに変換します。その構文を以下に示します-

File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.

画像を反転する

OpenCVでは、以下に説明する3種類のフリップコードを使用できます。

シニア番号 フリップコードと説明
1

0

0は、x軸を中心に反転することを意味します。

2

1

1は、y軸を中心に反転することを意味します。

3

-1

-1は、両方の軸を中心に反転することを意味します。

適切なフリップコードをメソッドに渡します flip() の中に Coreクラス。その構文を以下に示します-

Core.flip(source mat, destination mat1, flip_code);

メソッド flip() ソース画像マトリックス、宛先画像マトリックス、フリップコードの3つのパラメータを取ります。

フリップメソッドとは別に、Coreクラスによって提供される他のメソッドがあります。それらは簡単に説明されています-

シニア番号 方法と説明
1

add(Mat src1, Mat src2, Mat dst)

2つの配列または配列とスカラーの要素ごとの合計を計算します。

2

bitwise_and(Mat src1, Mat src2, Mat dst)

これは、2つの配列、または配列とスカラーの要素ごとのビット単位の結合を計算します。

3

bitwise_not(Mat src, Mat dst)

配列のすべてのビットを反転します。

4

circle(Mat img, Point center, int radius, Scalar color)

円を描きます。

5

sumElems(Mat src)

ガウスフィルターを使用して画像をぼかします。

6

subtract(Mat src1, Scalar src2, Mat dst, Mat mask)

2つの配列または配列とスカラーの間の要素ごとの差を計算します。

次の例は、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

元の画像

反転画像

この章では、画像をぼかす画像にガウスフィルターを適用します。OpenCV関数GaussianBlurを使用して、画像にガウスフィルターを適用します。Imgprocパッケージの下にあります。その構文を以下に示します-

Imgproc.GaussianBlur(source, destination,Size,SigmaX);

関数の引数を以下に説明します-

シニア番号 引数と説明
1

source

ソース画像です。

2

destination

行き先画像です。

3

Size

ガウスカーネルサイズです。

4

SigmaX

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)

ガウスフィルターを使用して画像をぼかします。

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 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());
      }
   }
}

出力

指定されたコードを実行すると、次の出力が表示されます-

元の画像

この元の画像をサイズ11および45のガウスフィルターで畳み込むと、次の出力が表示されます。

サイズ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)

ガウスフィルターを使用して画像をぼかします。

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 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のボックスフィルター付き)

この章では、2つの非常に一般的なモルフォロジー演算子である膨張と侵食の適用について学習します。

を使用しております OpenCV 関数 erode そして dilate。それらは下にありますImgprocパッケージ。その構文を以下に示します-

Imgproc.erode(source, destination, element);
Imgproc.dilate(source, destination, element);

パラメータは以下のとおりです-

シニア番号 パラメータと説明
1

source

ソース画像です。

2

destination

行き先画像です。

3

element

これは、侵食と膨張に使用される構造要素です。element= Mat()の場合、3 x3の長方形の構造要素が使用されます。

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)

ガウスフィルターを使用して画像をぼかします。

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());
      } 
   }
}

出力

指定されたコードを実行すると、次の出力が表示されます-

元の画像

上記の元の画像では、いくつかの侵食および拡張操作が実行されており、以下の出力に示されています。

侵食

膨張

この章では、画像に透かしを適用する2つの方法を学びます。これらの方法は-

  • テキスト透かしの適用
  • 画像透かしの適用

テキスト透かしの適用

を使用しております 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)

2Dベクトルの回転角を計算します。

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と同じサイズとチャネル番号の2番目の入力配列です。

4

beta

これは、2番目の配列要素の重みです。

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());
      }
   }
}

出力

指定されたコードを実行すると、次の出力が表示されます-

元の画像

透かし画像

透かし入りの画像

畳み込みは、2つの関数fとgに対する数学演算です。この場合の関数fとgは画像です。これは、画像も2次元関数であるためです。

畳み込みの実行

画像に対して畳み込みを実行するために、次の手順が実行されます-

  • マスクを(水平および垂直に)1回だけ裏返します。
  • マスクを画像上にスライドさせます。
  • 対応する要素を乗算してから追加します。
  • 画像のすべての値が計算されるまで、この手順を繰り返します。

を使用しております 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クラスを使用してグレースケールの画像で畳み込みを実行する方法を示しています。

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演算子は、画像のエッジ検出に使用されます。垂直エッジと水平エッジの2種類のエッジを検出します。

を使用しております OpenCV 関数 filter2DPrewitt演算子を画像に適用します。それは下にあります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)

ガウスフィルターを使用して画像をぼかします。

6

integral(Mat src, Mat sum)

画像の積分を計算します。

次の例は、Imgprocクラスを使用して、グレースケールの画像にPrewitt演算子を適用する方法を示しています。

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

畳み込み画像(垂直方向)

この元の画像は、水平エッジのプレウィット演算子で畳み込まれています。これを以下に示します。

水平方向

-1 -1 -1
0 0 0
1 1 1

畳み込み画像(水平方向)

Sobel演算子は、Prewitt演算子と非常によく似ています。これは微分マスクでもあり、エッジ検出に使用されます。Sobel演算子は、画像内の2種類のエッジ(垂直方向のエッジと水平方向のエッジ)を検出するために使用されます。

使用します OpenCV 関数 filter2DSobel演算子を画像に適用します。それは下にあります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)

ガウスフィルターを使用して画像をぼかします。

6

integral(Mat src, Mat sum)

画像の積分を計算します。

次の例は、Imgprocクラスを使用してSobel演算子をグレースケールの画像に適用する方法を示しています。

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

畳み込み画像(水平方向)

キルシュコンパスマスクは、エッジ検出に使用されるさらに別のタイプの微分マスクです。この演算子は、方向マスクとも呼ばれます。この演算子では、1つのマスクを取得し、それを8つのコンパス方向すべてに回転させて、8つの方向のエッジを取得します。

使用します OpenCV 関数 filter2DKirsch演算子を画像に適用します。それは下にあります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)

ガウスフィルターを使用して画像をぼかします。

6

integral(Mat src, Mat sum)

画像の積分を計算します。

次の例は、Imgprocクラスを使用してKirsch演算子をグレースケールの画像に適用する方法を示しています。

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演算子で畳み込まれています。

キルシュイースト

-3 -3 -3
-3 0 -3
5 5 5

畳み込み画像(キルシュイースト)

この元の画像は、南西エッジのKirsch演算子で畳み込まれています。

キルシュ南西部

5 5 -3
5 0 -3
-3 -3 -3

畳み込み画像(Kirsch South West)

ロビンソンコンパスマスクは、エッジ検出に使用されるさらに別のタイプの派生マスクです。この演算子は、方向マスクとも呼ばれます。この演算子では、1つのマスクを取得し、それを8つの主要な方向すべてに回転させて、8つの方向のエッジを取得します。

使用します OpenCV 関数 filter2Dロビンソン演算子を画像に適用します。それは下にありますImgprocパッケージ。その構文を以下に示します-

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

関数の引数を以下に説明します-

シニア番号 引数と説明
1

src

ソース画像です。

2

dst

行き先画像です。

3

depth

dstの深さです。負の値(-1など)は、深さがソースと同じであることを示します。

4

kernel

画像をスキャンするのはカーネルです。

5

anchor

これは、カーネルに対するアンカーの位置です。位置Point(-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)

ガウスフィルターを使用して画像をぼかします。

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 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());
      }
   }
}

出力

指定されたコードを実行すると、次の出力が表示されます-

元の画像

この元の画像は、以下に示すように、北端のロビンソン演算子で畳み込まれています。

北方向マスク

-1 0 1
-2 0 2
-1 0 1

畳み込み画像(ロビンソンノース)

この元の画像は、以下に示すように、イーストエッジのロビンソン演算子でも畳み込まれています。

東方向マスク

-1 -2 -1
0 0 0
1 2 1

畳み込み画像(ロビンソンイースト)

ラプラシアン演算子は、画像内のエッジを見つけるために使用される微分演算子でもあります。ラプラシアンと、プレウィット、ソーベル、ロビンソン、キルシュなどの他の演算子との主な違いは、これらはすべて1次微分マスクですが、ラプラシアンは2次微分マスクであるということです。

を使用しております 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)

ガウスフィルターを使用して画像をぼかします。

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 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());
      }
   }
}

出力

指定されたコードを実行すると、次の出力が表示されます-

元の画像

この元の画像は、以下に示すようにラプラシアン負の演算子で畳み込まれています-

ラプラシアンネガティブ

0 -1 0
-1 4 -1
0 -1 0

畳み込み画像(ラプラシアンネガティブ)

この元の画像は、以下に示すようにラプラシアンポジティブ演算子で畳み込まれています-

ラプラシアンポジティブ

0 1 0
1 -4 1
0 1 0

畳み込み画像(ラプラシアンポジティブ)

加重平均フィルターでは、中心値により多くの重みを与えました。これにより、中心の寄与が他の値よりも大きくなります。加重平均フィルタリングにより、画像のぼやけを制御できます。

を使用しております OpenCV 関数 filter2D加重平均フィルターを画像に適用します。それは下にありますImgprocパッケージ。その構文を以下に示します-

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

関数の引数を以下に説明します-

シニア番号 引数と説明
1

src

ソース画像です。

2

dst

行き先画像です。

3

ddepth

dstの深さです。負の値(-1など)は、深さがソースと同じであることを示します。

4

kernel

画像をスキャンするのはカーネルです。

5

anchor

これは、カーネルに対するアンカーの位置です。位置Point(-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)

ガウスフィルターを使用して画像をぼかします。

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

これは、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)

ガウスフィルターを使用して画像をぼかします。

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

ImageJは、Macintosh用のNIHImageに触発されたパブリックドメインのJava画像処理プログラムです。8ビット、16ビット、および32ビットの画像を表示、編集、分析、処理、保存、および印刷できます。

ImageJの基本的な機能のいくつかを以下に説明します-

シニア番号 機能と説明
1

Runs Everywhere

ImageJはJavaで記述されているため、Linux、Mac OS X、およびWindowsで、32ビットモードと64ビットモードの両方で実行できます。

2

Open Source

ImageJとそのJavaソースコードは無料でパブリックドメインで入手できます。

3

Toolkit

ImageJを画像処理ツールキット(クラスライブラリ)として使用して、アプレット、サーブレット、またはアプリケーションを開発します。

4

Data Types

8ビットのグレースケールまたはインデックスカラー、16ビットの符号なし整数、32ビットの浮動小数点、およびRGBカラー。

5

File Formats

GIF、JPEG、BMP、PNG、PGM、FITS、およびASCIIを開いて保存します。DICOMを開きます。URLを使用して、TIFF、GIF、JPEG、DICOM、および生データを開きます。

6

Selections

長方形、楕円形、または不規則な領域の選択を作成します。線と点の選択を作成します。

7

Image Enhancement

8ビットグレースケールとRGBカラー画像の両方で、スムージング、シャープニング、エッジ検出、メディアンフィルタリング、およびしきい値処理をサポートします。

8

Color Processing

32ビットカラー画像をRGBまたはHSVコンポーネントに分割します。8ビットコンポーネントをカラー画像にマージします。

フィジー

フィジーは画像処理パッケージです。これは、Java、Java3D、および一貫したメニュー構造に編成された多くのプラグインとともに、ImageJ(およびImageJ2)のディストリビューションとして説明できます。UbuntuがLinuxと比較するように、フィジーはImageJと比較します。

ImageJの基本機能とは別に、フィジーの高度な機能のいくつかを以下に説明します-

シニア番号 機能と説明
1

Registering 3D images

これには、弾性アライメントとモンタージュ、特徴抽出、画像スタビライザーなどが含まれます。

2

Segmenting images

35種類以上のセグメンテーションを提供します。

3

Useful keyboard short cuts

Fujiにはキーボードショートカットがたくさんあります。

4

Scripting

JavaScript、JRuby、Jython、Clojure、およびBeanshellでマクロを使用したスクリプトを許可します。

5

Developing Plug-ins

スクリプトエディタを使用してプラグインの開発を開始してから、プラグインを実行します。

6

ImageJ Tricks

ImageJは使いやすいですが、実際に実装されている関数が必要な場合がありますが、トリガーする方法がわかりません。

コモンズイメージング

以前はApacheCommonsSanselanとして知られていたApacheCommons Imagingは、(サイズ、色、スペース、ICCプロファイルなど)やメタデータなどの画像情報の高速解析を含む、さまざまな画像形式の読み取りと書き込みを行うライブラリです。

ImageJの基本的な機能のいくつかを以下に説明します-

シニア番号 機能と説明
1

Java

Apache Commons Imagingは、100%純粋なJavaで記述されています。変更することなく、任意の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は、ビットマップイメージを作成、編集、作成、または変換するためのソフトウェアスイートです。DPX、EXR、GIF、JPEG、JPEG-2000、PDF、PNG、Postscript、SVG、TIFFを含む100以上の形式で画像を読み書きできます。ImageMagickを使用して、画像のサイズ変更、反転、ミラーリング、回転、変形、せん断、変換、画像の色の調整、さまざまな特殊効果の適用、テキスト、線、ポリゴン、楕円、ベジェ曲線の描画を行います。

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の基本的な機能のいくつかを以下に説明します-

シニア番号 機能と説明
1

View data

データを2Dおよび3Dで表示します。複雑な4Dデータスキームと無制限の数のチャネルを処理するように設計されており、各チャネルは独自のX、Y、およびZ解像度を持つことができます。

2

Annotate your images

画像に自動的または手動で注釈を付けて、画像を理解し、統計を取得します。

3

Undo and Redo

すべての操作を元に戻したり、やり直したりできます。

4

Lazy Evaluation

大きな画像セットを処理するために地面から設計されています。Endrovは、遅延評価を使用します。これは、主に研究プログラミング言語で利用可能な概念です。

5

Scripting language

従来のスクリプトだけでなく、グラフィカルなスクリプト言語もサポートしています。

6

Java

Javaで書かれています。プラグインアーキテクチャにより、新しいJavaプラグインで簡単に拡張できます。Matlabと対話できます。

7

Formats

バイオフォーマットを使用して、ほぼすべての商用およびオープンファイルフォーマットにアクセスします。

8

Microscopic Processing

1つのプログラムですべての顕微鏡を制御し、オンザフライの画像分析を行うことができます。

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やWindowsWFでホストされるアプリケーションなど、シングルスレッドおよびマルチスレッドのアプリケーションに画像の色空間機能を追加できます。

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

これには、ぼかし、ガウスぼかし、中央値ぼかし、および両側フィルターの適用が含まれます。

2

Eroding and Dilating

これは、2つの非常に一般的なモルフォロジー演算子である拡張と侵食を適用できます。

3

Morphology Transformations

OpenCV関数morphologyExは、opening、closeing、TopHat、BlackHatなどのモルフォロジー変換を適用します。

4

Image Pyramids

OpenCV関数pyrUpおよびpyrDownは、特定の画像をダウンサンプルまたはアップサンプルします。

4

Basic Thresholding Operations

OpenCV関数のしきい値を使用して基本的なしきい値操作を実行します。

5

Adding borders to your images

OpenCV関数copyMakeBorderは、境界線を設定するために使用されます(画像への追加のパディング)。

7

Remapping

OpenCVでは、関数remapは単純な再マッピングの実装を提供します。

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

これには、ぼかし、ガウスぼかし、メディアンぼかし、およびバイラテラルフィルターの適用が含まれます。

2

Eroding and Dilating

これは、2つの非常に一般的なモルフォロジー演算子である拡張と侵食を適用できます。

3

Morphology Transformations

OpenCV関数morphologyExは、opening、closeing、TopHat、BlackHatなどのモルフォロジー変換を適用します。

4

Image Pyramids

OpenCV関数pyrUpおよびpyrDownは、特定の画像をダウンサンプルまたはアップサンプルします。

4

Basic Thresholding Operations

OpenCV関数のしきい値を使用して基本的なしきい値操作を実行できます。

5

Adding borders to your images

OpenCV関数copyMakeBorderは、境界線を設定するために使用されます(画像への追加のパディング)。

7

Remapping

OpenCVでは、関数remapは単純な再マッピングの実装を提供します。

8

Histogram Calculation

簡単な目的で、OpenCVは関数calcHistを実装します。この関数は、一連の配列(通常は画像または画像平面)のヒストグラムを計算します。最大32次元で動作できます。

OpenCVの統合

次の手順では、OpenCVをアプリケーションに統合する方法について説明します。

OpenCVをダウンロードする

OpenCVは、こちらの公式Webサイトからダウンロードできます。

ユーザーライブラリを作成する

さらに、OpenCVのユーザーライブラリを作成して、将来のプロジェクトとして使用できるようにします。

Eclipseを起動します

メニューから「ウィンドウ」->「設定」を選択します。

「Java」->「ビルドパス」->「ユーザーライブラリ」の下に移動し、「新規」をクリックします。

次に、ライブラリの名前を入力します。たとえば、OpenCV-2.4.6。

その後、新しいユーザーライブラリ(つまりOpenCV-2.4.6)を選択し、[外部JARの追加]をクリックします。

C:\ OpenCV-2.4.6 \ build \ java \を参照し、opencv-246.jarを選択します。jarを追加した後、opencv-246.jarを拡張し、[ネイティブライブラリの場所]を選択して[編集]を押します。

[外部フォルダー...]を選択し、C:\ OpenCV-2.4.6 \ build \ java \ x64フォルダーを参照して選択します。32ビットシステムを使用している場合は、x64ではなくx86フォルダーを選択する必要があります。

[OK]を押すと、完了です。

これで、ユーザーライブラリが作成されました。これで、この構成をどのプロジェクトでも再利用できます。

OpenCVプロジェクトを作成する

Eclipseで新しいJavaプロジェクトを作成します。

[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からグレースケール形式に変換できます cvtColor() の中に Imgprocクラス。その構文を以下に示します-

Imgproc.cvtColor(source mat, destination mat1, Imgproc.COLOR_RGB2GRAY);

メソッド cvtColor() ソース画像マトリックス、デスティネーション画像マトリックス、および色変換タイプの3つのパラメーターを取ります。

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)

ガウスフィルターを使用して画像をぼかします。

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_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.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() ソース画像マトリックス、デスティネーション画像マトリックス、および色変換タイプの3つのパラメーターを取ります。

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)

ガウスフィルターを使用して画像をぼかします。

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)