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) の任意の長方形領域を計算 |
2 | getColorModel() 画像のColorModelクラスのオブジェクトを返します。 |
3 | getData() 画像を1つの大きなタイルとして返します。 |
4 | getData(Rectangle rect) の任意の領域を計算して返します |
5 | getGraphics() このメソッドはGraphics2Dを返し、下位互換性を保持します。 |
6 | getHeight() の高さを返します |
7 | getMinX() これの最小x座標を返します |
8 | getMinY() これの最小y座標を返します |
9 | getRGB(int x, int y) デフォルトのRGBカラーモデル(TYPE_INT_ARGB)とデフォルトのsRGB色空間で整数ピクセルを返します。 |
10 | getType() 画像タイプを返します。 |
例
次の例は、BufferedImage
GraphicsObjectを使用して画面にテキストを描画する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。