Java-dip-quick-guide
Java DIP-はじめに
デジタル画像処理(DIP)は、デジタルコンピューターを使用してデジタル画像を操作します。 信号とシステムのサブフィールドですが、特に画像に焦点を当てています。 DIPは、画像の処理を実行できるコンピューターシステムの開発に重点を置いています。 そのようなシステムの入力はデジタル画像です。 システムは、効率的なアルゴリズムを使用して画像を処理し、出力として画像を提供します。
Javaは、現代世界で広く使用されている高レベルのプログラミング言語です。 さまざまな機能を使用して、デジタル画像処理を効率的にサポートおよび処理できます。
Java BufferedImageクラス
Java `+ BufferedImage `クラスはImageクラスのサブクラスです。 画像データの処理と操作に使用されます。 ` BufferedImage `は、画像データのColorModelで構成されています。 すべての ` BufferedImage +`オブジェクトの左上隅の座標は(0、0)です。
コンストラクタ
このクラスは、3種類のコンストラクターをサポートします。
最初のコンストラクターは、指定されたColorModelとRasterで新しい `+ BufferedImage +`を構築します。
BufferedImage(ColorModel cm, WritableRaster raster,
boolean isRasterPremultiplied, Hashtable<?,?> properties)
2番目のコンストラクターは、定義済みの画像タイプの1つの `+ BufferedImage +`を構築します。
BufferedImage(int width, int height, int imageType)
3番目のコンストラクタは、事前定義された画像タイプの1つであるTYPE_BYTE_BINARYまたはTYPE_BYTE_INDEXEDの `+ BufferedImage +`を構築します。
BufferedImage(int width, int height, int imageType, IndexColorModel cm)
Sr.No | Method & Description |
---|---|
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() 画像タイプを返します。 |
例
次の例は、グラフィックスオブジェクトを使用して画面にテキストを描画するjava `+ BufferedImage +`クラスの使用を示しています-
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.finddevguides.com", 20,20);
g.drawString("www.finddevguides.com", 20,40);
g.drawString("www.finddevguides.com", 20,60);
g.drawString("www.finddevguides.com", 20,80);
g.drawString("www.finddevguides.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);
}
}
出力
あなたが与えられたコードを実行すると、次の出力が見られます-
画像のダウンロードとアップロード
この章では、インターネットから画像をダウンロードし、画像に対していくつかの画像処理技術を実行し、処理した画像をサーバーに再度アップロードする方法について説明します。
画像をダウンロードする
ウェブサイトから画像をダウンロードするには、 URL という名前のJavaクラスを使用します。これは java.net パッケージにあります。 その構文は以下のとおりです-
String website = "http://finddevguides.com";
URL url = new URL(website);
上記のメソッドとは別に、簡単に説明したように、クラスURLで利用可能な他のメソッドがあります-
Sr.No. | Method & Description |
---|---|
1 |
public String getPath() URLのパスを返します。 |
2 |
public String getQuery() URLのクエリ部分を返します。 |
3 |
public String getAuthority() URLの権限を返します。 |
4 |
public int getPort() URLのポートを返します。 |
5 |
public int getDefaultPort() URLのプロトコルのデフォルトポートを返します。 |
6 |
public String getProtocol() URLのプロトコルを返します。 |
7 |
public String getHost() URLのホストを返します。 |
例
次の例は、Java URLクラスを使用してインターネットから画像をダウンロードする方法を示しています-
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
public class Download {
public static void main(String[] args) throws Exception {
try{
String fileName = "digital_image_processing.jpg";
String website = "http://finddevguides.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);
画像をバイト配列に変換するには、 ByteArrayOutputStream クラスの* toByteArray()*メソッドを使用します。 その構文は以下のとおりです-
byte[] bytes = baos.toByteArray();
上記のメソッドとは別に、簡単に説明したようにByteArrayOutputStreamクラスで利用可能な他のメソッドがあります-
Sr.No. | Method & Description |
---|---|
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) オフセットoffから始まるlen個のバイトをストリームに書き込みます。 |
6 |
public void writeTo(OutputStream outSt) このStreamのコンテンツ全体を指定されたストリーム引数に書き込みます。 |
例
次の例は、サーバーに画像をアップロードする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);
}
}
出力
クライアント側の出力
あなたがクライアントコードを実行すると、次の出力がクライアント側に表示されます-
サーバー側の出力
サーバーコードを実行すると、サーバー側に次の出力が表示されます-
画像を受信した後、サーバーは以下に示すように画像を表示します-
Java DIP-画像ピクセル
画像には、ピクセルの2次元配列が含まれます。 実際には、画像を構成するピクセルの値です。 通常、画像はカラーまたはグレースケールです。
Javaでは、BufferedImageクラスを使用して画像を処理します。 ピクセルの値を取得するには、 BufferedImage クラスの* getRGB()*メソッドを呼び出す必要があります。
ピクセル値を取得する
ピクセル値は、次の構文を使用して受信できます。
Color c = new Color(image.getRGB(j, i));
RGB値の取得
メソッド* getRGB()*は、行と列のインデックスをパラメーターとして受け取り、適切なピクセルを返します。 カラー画像の場合、3つの値(赤、緑、青)を返します。 彼らは次のように得ることができます-
c.getRed();
c.getGreen();
c.getBlue();
画像の幅と高さを取得する
画像の高さと幅は、BufferedImageクラスの* getWidth()および getHeight()*メソッドを呼び出すことで取得できます。 その構文は以下のとおりです-
int width = image.getWidth();
int height = image.getHeight();
これらのメソッドとは別に、BufferedImageクラスでサポートされている他のメソッドがあります。 それらについて簡単に説明します
Sr.No. | Method & Description |
---|---|
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)の画像のピクセルを表示するjava BufferedImageクラスの使用を示しています。
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();
}
}
出力
上記の例を実行すると、次の画像のピクセルが印刷されます-
元の画像
ピクセル出力
出力を下にスクロールすると、次のパターンが表示されます-
Java DIP-グレースケール変換
カラー画像をグレースケール画像に変換するには、 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クラスで利用可能な他のメソッドがあります-
Sr.No. | Method & Description |
---|---|
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() このColorの文字列表現を返します。 |
最後の手順では、これら3つの値をすべて追加し、対応するピクセル値に再度設定します。 その構文は以下のとおりです-
int sum = red+green+blue;
Color newColor = new Color(sum,sum,sum);
image.setRGB(j,i,newColor.getRGB());
例
次の例は、画像をグレースケールに変換するJava BufferedImageクラスの使用を示しています-
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 という名前でハードディスクに書き込まれます。
元画像
グレースケール画像
Java DIP-画像コントラストの強化
この章では、ヒストグラム均等化を使用して画像のコントラストを強調する方法を学びます。
*OpenCV* 関数* equalizeHist()*メソッドを使用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
Imgproc.equalizeHist(source, destination);
パラメータは以下のとおりです-
Sr.No. | Parameter & Description |
---|---|
1 |
Source これは、8ビットのシングルチャネルソースイメージです。 |
2 |
Destination これは宛先イメージです。 |
equalizeHist()メソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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());
}
}
}
出力
あなたが与えられたコードを実行すると、次の出力が見られます-
元画像
コントラスト画像の強化
Java DIP-画像の明るさを向上させる
この章では、画像の各ピクセルにアルファ値を乗算し、別のベータ値を追加することにより、画像の輝度を高めます。
上記の操作を自動的に行う OpenCV 関数 convertTo です。 Mat パッケージの下にあります。 その構文は以下のとおりです-
int alpha = 2;
int beta = 50;
sourceImage.convertTo(destination, rtype , alpha, beta);
パラメータは以下のとおりです-
Sr.No. | Parameter & Description |
---|---|
1 |
destination 宛先画像です。 |
2 |
rtype チャネルの数は入力と同じであるため、出力行列タイプまたはむしろ深さが望ましいです。 rtypeが負の場合、出力行列は入力と同じ型になります。 |
3 |
alpha オプションのスケール係数です。 |
4 |
beta これは、スケーリングされた値に追加されるオプションのデルタです。 |
convertToメソッドとは別に、Matクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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());
}
}
}
出力
あなたが与えられたコードを実行すると、次の出力が見られます-
元画像
強化された明るい画像(Alpha = 1およびBeta = 50)
強化された明るい画像(Alpha = 2およびBeta = 50)
Java DIP-画像のシャープネスの強化
この章では、ガウスフィルターを使用して画像の鮮明度を上げる方法を学びます。
まず、 OpenCV 関数 GaussianBlur を使用します。 Imgproc パッケージの下にあります。 その構文は以下のとおりです-
Imgproc.GaussianBlur(source, destination, new Size(0,0), sigmaX);
パラメータは簡単に説明されています-
Sr.No. | Parameter & Description |
---|---|
1 |
source ソース画像です。 |
2 |
destination 宛先画像です。 |
3 |
Size ガウスカーネルサイズです。 |
4 |
sigmaX X方向のガウスカーネル標準偏差です。 |
さらに、 OpenCV 関数 addWeighted を使用して、画像に画像の透かしを適用します。 Core パッケージの下にあります。 その構文は以下のとおりです-
Core.addWeighted(InputArray src1, alpha, src2, beta, gamma, OutputArray dst);
この関数のパラメータは以下に説明されています-
Sr.No. | Parameter & Description |
---|---|
1 |
src1 最初の入力配列です。 |
2 |
alpha 最初の配列要素の重みです。 |
3 |
src2 これは、src1と同じサイズとチャネル番号の2番目の入力配列です。 |
4 |
Beta 2番目の配列要素の重みです。 |
5 |
gamma 各合計にスカラーが加算されます。 |
6 |
dst 入力配列と同じサイズとチャンネル数を持つ出力配列です。 |
GaussianBlurメソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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 DIP-画像圧縮技術
画像は、Javaを使用して簡単に圧縮および保存できます。 画像の圧縮には、画像をjpgに変換して保存することが含まれます。
画像を圧縮するために、画像を読み取ってBufferedImageオブジェクトに変換します。
さらに、ImageIOクラスにある* getImageWritersByFormatName()メソッドからImageWriterを取得します。 このImageWriterから、 *ImageWriteParam オブジェクトを作成します。 その構文は以下のとおりです-
Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();
このImageWriteParamオブジェクトから、* setCompressionMode()および setCompressionQuality()*の2つのメソッドを呼び出すことにより、圧縮を設定できます。 それらの構文は以下のとおりです-
obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);
setCompressionMode()メソッドは、パラメーターとしてMode_EXPLICITを取ります。 他のモードのいくつかは簡単に説明されています-
Sr.No. | Modes |
---|---|
1 |
MODE_DEFAULT これは、将来の書き込みでその機能を有効にするためにメソッドに渡すことができる定数値です。 |
2 |
MODE_DISABLED これは、将来の書き込みでその機能を無効にするためにメソッドに渡される定数値です。 |
3 |
MODE_EXPLICIT これは、将来の書き込みでその機能を有効にするためにメソッドに渡すことができる定数値です。 |
圧縮メソッドとは別に、ImageWriteParamクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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
Java DIP-ボーダーの追加
この章では、画像にさまざまな種類の境界線を追加する方法を学びます。
*OpenCV* 関数 *copyMakeBorder* を使用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
Imgproc.copyMakeBorder(source,destination,top,bottom,left,right,borderType);
パラメータは以下のとおりです-
Sr.No. | Parameter & Description |
---|---|
1 |
source ソース画像です。 |
2 |
destination 宛先画像です。 |
3 |
top 画像の上部の境界線のピクセル単位の長さです。 |
4 |
bottom 画像の下部の境界線のピクセル単位の長さ。 |
5 |
left これは、画像の左側の境界線のピクセル単位の長さです。 |
6 |
right これは、画像の右側の境界線のピクセル単位の長さです。 |
7 |
borderType 境界線のタイプを定義します。 可能な境界線は、BORDER_REPLICATE、BORDER_REFLECT、BORDER_WRAP、BORDER_CONSTANTなどです。 |
copyMakeBorder()メソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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());
}
}
}
出力
あなたが与えられたコードを実行すると、次の出力が見られます-
元画像
孤立したボーダー画像
ラップされた境界線画像
ボーダー画像を反映
Java DIP-イメージピラミッド
画像ピラミッドは、多重解像度画像を表示する方法に他なりません。 最下層は画像の最高解像度バージョンであり、最上層は画像の最低解像度バージョンです。 画像ピラミッドは、異なるスケールで画像を処理するために使用されます。
この章では、画像に対してダウンサンプリングとアップサンプリングを実行します。
*OpenCV* 関数 *pyrUp* および *pyrDown* を使用します。 それらは *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
Imgproc.pyrUp(source, destination, destinationSize);
Imgproc.pyrDown(source, destination,destinationSize);
パラメータは以下のとおりです-
Sr.No. | Parameter & Description |
---|---|
1 |
source ソース画像です。 |
2 |
destination これは宛先イメージです。 |
3 |
destinationSize 出力画像のサイズです。 デフォルトでは、Size((src.cols 2)、(src.rows 2))として計算されます。 |
pyrUpおよびpyrDownメソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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サンプリング)とpyrDown(ダウンサンプリング)が実行されます。 サンプリング後の出力は次のようになります-
PyrUPイメージ
pyrDown画像
Java DIP-基本的なしきい値設定
しきい値処理により、最も簡単な方法で画像のセグメント化を実現できます。 画像のセグメンテーションとは、各セットのピクセルがいくつかの共通の特性を持つように、完全な画像をピクセルのセットに分割することを意味します。 画像のセグメンテーションは、オブジェクトとその境界を定義するのに非常に役立ちます。
この章では、画像に対していくつかの基本的なしきい値処理を実行します。
*OpenCV* 関数 *threshold* を使用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
Imgproc.threshold(source, destination, thresh , maxval , type);
パラメータは以下のとおりです-
Sr.No. | Parameter & Description |
---|---|
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クラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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());
}
}
}
出力
あなたが与えられたコードを実行すると、次の出力が見られます-
元画像
上記の元の画像では、以下の出力に示されているいくつかのしきい値処理が実行されます-
スレッシュバイナリ
スレッシュバイナリ反転
スレッシュゼロ
Java DIP-画像形状変換
OpenCVを使用すると、画像の形状を簡単に変更できます。 画像は、4つの方向のいずれかに反転、拡大縮小、または回転できます。
画像の形状を変更するために、画像を読み取り、Matオブジェクトに変換します。 その構文は以下のとおりです-
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
画像の反転
OpenCVでは、以下に説明する3種類のフリップコードを使用できます-
Sr.No. | Flip Code & Description |
---|---|
1 |
0 0は、x軸を中心に反転することを意味します。 |
2 |
1 1は、y軸を中心に反転することを意味します。 |
3 |
-1 -1は、両方の軸を中心に反転することを意味します。 |
適切なフリップコードを Core クラスのメソッド* flip()*に渡します。 その構文は以下のとおりです-
Core.flip(source mat, destination mat1, flip_code);
メソッド* flip()*は、ソースイメージマトリックス、デスティネーションイメージマトリックス、フリップコードの3つのパラメーターを取ります。
flipメソッドとは別に、Coreクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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つの配列または配列とスカラー間の要素ごとの差を計算します。 |
例
次の例は、イメージを反転するコアクラスの使用を示しています-
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 という名前でハードディスクに書き込みます。
元画像
反転画像
Java DIP-ガウスフィルターの適用
この章では、画像をぼかす画像にガウスフィルターを適用します。 OpenCV関数GaussianBlurを使用して、画像にガウスフィルターを適用します。 Imgprocパッケージの下にあります。 その構文は以下のとおりです-
Imgproc.GaussianBlur(source, destination,Size,SigmaX);
関数の引数は以下に説明されています-
Sr.No. | Argument & Description |
---|---|
1 |
source ソース画像です。 |
2 |
destination 宛先画像です。 |
3 |
Size ガウスカーネルサイズです。 |
4 |
SigmaX X方向のガウスカーネル標準偏差です。 |
GaussianBlurメソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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のガウスフィルター
Java DIP-ボックスフィルターの適用
画像をぼかすボックスフィルターを適用します。 ボックスフィルターの寸法は、3x3、5x5、9x9などです。
*OpenCV* 関数 *filter2D* を使用して、ボックスフィルターを画像に適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
関数の引数は以下に説明されています-
Sr.No. | Argument & Description |
---|---|
1 |
src ソース画像です。 |
2 |
dst 宛先画像です。 |
3 |
depth dstの深さです。 負の値(-1など)は、深度がソースと同じであることを示します。 |
4 |
kernel イメージをスキャンするのはカーネルです。 |
5 |
anchor カーネルに対するアンカーの位置です。 ロケーションポイント(-1、-1)は、デフォルトで中心を示します。 |
6 |
delta これは、畳み込み中に各ピクセルに追加される値です。 デフォルトでは0です。 |
7 |
BORDER_DEFAULT デフォルトではこの値を許可します。 |
filter2D()メソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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のボックスフィルターを使用)
Java DIP-侵食と膨張
この章では、膨張と収縮の2つの非常に一般的な形態演算子を適用することを学びます。
*OpenCV* 関数 *erode* および *dilate* を使用します。 それらは *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
Imgproc.erode(source, destination, element);
Imgproc.dilate(source, destination, element);
パラメータは以下のとおりです-
Sr.No. | Parameter & Description |
---|---|
1 |
source ソース画像です。 |
2 |
destination 宛先画像です。 |
3 |
element これは収縮と膨張に使用される構造化要素であり、element = Mat()の場合、3 x 3の長方形の構造化要素が使用されます。 |
erode()およびdilate()メソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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());
}
}
}
出力
あなたが与えられたコードを実行すると、次の出力が見られます-
元画像
上記の元の画像では、以下の出力に示されているいくつかの収縮および膨張操作が実行されています-
侵食
膨張
Java DIP-透かしの適用
この章では、画像に透かしを適用する2つの方法を学びます。 これらの方法は-
- テキスト透かしの適用
- 画像の透かしの適用
テキスト透かしの適用
*OpenCV* 関数 *putText* を使用して、画像にテキストの透かしを適用します。 *Core* パッケージの下にあります。 その構文は以下のとおりです-
Core.putText(source, Text, Point, fontFace ,fontScale , color);
この関数のパラメータは以下に説明されています-
Sr.No. | Parameter & Description |
---|---|
1 |
Source ソース画像です。 |
2 |
Text 画像に表示されるのは文字列テキストです。 |
3 |
Point 画像上にテキストが表示されるポイントです。 |
4 |
fontFace フォントの種類。 例えば-FONT_HERSHEY_SIMPLEX、FONT_HERSHEY_PLAIN、FONT_HERSHEY_COMPLEXなど。 |
5 |
fontScale フォント固有の基本サイズを乗算するのは、フォントスケール係数です。 |
6 |
color テキストの色です。 |
putTextメソッドとは別に、Coreクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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, "finddevguides.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);
この関数のパラメータは以下に説明されています-
Sr.No. | Parameter & Description |
---|---|
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());
}
}
}
出力
あなたが与えられたコードを実行すると、次の出力が見られます-
元画像
透かし画像
透かし画像
Java DIP-畳み込みを理解する
畳み込みは、2つの関数fとgの数学演算です。 この場合の関数fとgは画像です。画像も2次元の関数だからです。
畳み込みの実行
画像の畳み込みを実行するために、次の手順が実行されます-
マスクを(水平および垂直に)1回だけ反転します。
マスクを画像上にスライドさせます。
対応する要素を乗算してから追加します。
画像のすべての値が計算されるまで、この手順を繰り返します。
*OpenCV* 関数 *filter2D* を使用して、画像に畳み込みを適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
関数の引数は以下に説明されています-
Sr.No. | Argument & Description |
---|---|
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 |
元画像
畳み込み画像
Java DIP-Prewitt Operator
Prewitt演算子は、画像のエッジ検出に使用されます。 垂直エッジと水平エッジの2種類のエッジを検出します。
*OpenCV* 関数 *filter2D* を使用して、Prewitt演算子を画像に適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
関数の引数は以下に説明されています-
Sr.No. | Argument & Description |
---|---|
1 |
src ソース画像です。 |
2 |
dst 宛先画像です。 |
3 |
depth dstの深さです。 負の値(-1など)は、深度がソースと同じであることを示します。 |
4 |
kernel イメージをスキャンするのはカーネルです。 |
5 |
anchor カーネルに対するアンカーの位置です。 ロケーションポイント(-1、-1)は、デフォルトで中心を示します。 |
6 |
delta これは、畳み込み中に各ピクセルに追加される値です。 デフォルトでは0です。 |
7 |
BORDER_DEFAULT デフォルトではこの値を許可します。 |
filter2Dメソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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 |
畳み込み画像(水平方向)
Java DIP-Sobelオペレーター
Sobel演算子はPrewitt演算子に非常に似ています。 これは微分マスクでもあり、エッジ検出に使用されます。 Sobel演算子は、画像内の2種類のエッジを検出するために使用されます。垂直方向のエッジと水平方向のエッジです。
*OpenCV* 関数 *filter2D* を使用して、Sobel演算子を画像に適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
関数の引数は以下に説明されています-
Sr.No. | Argument |
---|---|
1 |
src ソース画像です。 |
2 |
dst 宛先画像です。 |
3 |
depth dstの深さです。 負の値(-1など)は、深度がソースと同じであることを示します。 |
4 |
kernel イメージをスキャンするのはカーネルです。 |
5 |
anchor カーネルに対するアンカーの位置です。 ロケーションポイント(-1、-1)は、デフォルトで中心を示します。 |
6 |
delta これは、畳み込み中に各ピクセルに追加される値です。 デフォルトでは0です。 |
7 |
BORDER_DEFAULT デフォルトではこの値を許可します。 |
filter2Dメソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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 |
畳み込み画像(水平方向)
Java DIP-Kirschオペレーター
Kirschコンパスマスクは、エッジ検出に使用される派生マスクのもう1つのタイプです。 この演算子は、方向マスクとも呼ばれます。 この演算子では、1つのマスクを使用して8つのコンパス方向すべてにマスクを回転し、8つの方向のエッジを取得します。
*OpenCV* 関数 *filter2D* を使用して、キルシュ演算子を画像に適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
関数の引数は以下に説明されています-
Sr.No. | Argument |
---|---|
1 |
src ソース画像です。 |
2 |
dst 宛先画像です。 |
3 |
depth dstの深さです。 負の値(-1など)は、深度がソースと同じであることを示します。 |
4 |
kernel イメージをスキャンするのはカーネルです。 |
5 |
anchor カーネルに対するアンカーの位置です。 ロケーションポイント(-1、-1)は、デフォルトで中心を示します。 |
6 |
delta これは、畳み込み中に各ピクセルに追加される値です。 デフォルトでは0です。 |
7 |
BORDER_DEFAULT デフォルトではこの値を許可します。 |
filter2D()メソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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,-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());
}
}
}
出力
あなたが与えられたコードを実行すると、次の出力が見られます-
元画像
この元の画像は、以下に示すように、イーストエッジのキルシュ演算子と畳み込まれています-
キルシュイースト
-3 | -3 | -3 |
-3 | 0 | -3 |
5 | 5 | 5 |
Convolved Image(Kirsch East)
この元の画像は、以下に示すように、南西端のキルシュ演算子と畳み込まれています-
キルシュ南西部
5 | 5 | -3 |
5 | 0 | -3 |
-3 | -3 | -3 |
Convolved Image(キルシュ南西部)
Java DIP-ロビンソン演算子
ロビンソンコンパスマスクは、エッジ検出に使用される派生マスクのもう1つのタイプです。 この演算子は、方向マスクとも呼ばれます。 この演算子では、1つのマスクを取り、8つの主要な方向すべてにマスクを回転させて、8つの方向のエッジを取得します。
*OpenCV* 関数 *filter2D* を使用して、ロビンソン演算子を画像に適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
関数の引数は以下に説明されています-
Sr.No. | Argument & Description |
---|---|
1 |
src ソース画像です。 |
2 |
dst 宛先画像です。 |
3 |
depth dstの深さです。 負の値(-1など)は、深度がソースと同じであることを示します。 |
4 |
kernel イメージをスキャンするのはカーネルです。 |
5 |
anchor カーネルに対するアンカーの位置です。 場所Point(-1、-1)は、デフォルトで中心を示します。 |
6 |
delta これは、畳み込み中に各ピクセルに追加される値です。 デフォルトでは0です。 |
7 |
BORDER_DEFAULT デフォルトではこの値を許可します。 |
filter2Dメソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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 |
Convolved Image(ロビンソンノース)
この元の画像は、以下に示すように、イーストエッジのロビンソン演算子とも畳み込まれています-
東方向マスク
-1 | -2 | -1 |
0 | 0 | 0 |
1 | 2 | 1 |
Convolved Image(ロビンソンイースト)
Java DIP-ラプラシアン演算子
ラプラシアン演算子は、画像内のエッジを見つけるために使用される微分演算子でもあります。 ラプラシアンとPrewitt、Sobel、Robinson、Kirschなどの他の演算子の主な違いは、これらはすべて1次微分マスクですが、ラプラシアンは2次微分マスクであることです。
*OpenCV* 関数 *filter2D* を使用して、画像にラプラシアン演算子を適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
関数の引数は以下に説明されています-
Sr.No. | Arguments |
---|---|
1 |
src ソース画像です。 |
2 |
dst 宛先画像です。 |
3 |
depth dstの深さです。 負の値(-1など)は、深度がソースと同じであることを示します。 |
4 |
kernel イメージをスキャンするのはカーネルです。 |
5 |
anchor カーネルに対するアンカーの位置です。 ロケーションポイント(-1、-1)は、デフォルトで中心を示します。 |
6 |
delta これは、畳み込み中に各ピクセルに追加される値です。 デフォルトでは0です。 |
7 |
BORDER_DEFAULT デフォルトではこの値を許可します。 |
filter2D()メソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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 |
畳み込み画像(ラプラシアンポジティブ)
Java DIP-加重平均フィルター
加重平均フィルターでは、中心の値により多くの重みを与えました。これにより、中心の寄与が残りの値よりも大きくなります。 加重平均フィルタリングにより、画像のぼかしを制御できます。
*OpenCV* 関数 *filter2D* を使用して、加重平均フィルターを画像に適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
関数の引数は以下に説明されています-
Sr.No. | Argument & Description |
---|---|
1 |
src ソース画像です。 |
2 |
dst 宛先画像です。 |
3 |
ddepth dstの深さです。 負の値(-1など)は、深度がソースと同じであることを示します。 |
4 |
kernel イメージをスキャンするのはカーネルです。 |
5 |
anchor カーネルに対するアンカーの位置です。 場所Point(-1、-1)は、デフォルトで中心を示します。 |
6 |
delta これは、畳み込み中に各ピクセルに追加される値です。 デフォルトでは0です。 |
7 |
BORDER_DEFAULT デフォルトではこの値を許可します。 |
filter2D()メソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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 |
畳み込み画像
Java DIP-ズーム効果の作成
ズームとは、画像を拡大して、画像の細部を目立たせて目立たせるプロセスです。
*OpenCV* 関数 *resize* を使用して、画像にズームを適用します。 *Imgproc* パッケージの下にあります。 その構文は以下のとおりです-
Imgproc.resize(source,destination, destination.size(),zoomFactor,zoomFactor,Interpolation);
サイズ変更関数では、ソースイメージ、デスティネーションイメージとそのサイズ、ズーム係数、使用する補間方法を渡します。
利用可能な補間方法は以下のとおりです-
Sr.No. | Interpolation method & Description |
---|---|
1 |
INTER_NEAREST これは、最近傍内挿です。 |
2 |
INTER_LINEAR これは双線形補間です(デフォルトで使用)。 |
3 |
INTER_AREA ピクセル面積関係を使用したリサンプリングです。 より自由な結果が得られるため、画像の間引きの好ましい方法かもしれません。 |
4 |
INTER_CUBIC これは、4x4ピクセル周辺のバイキュービック補間です。 |
5 |
INTER_LANCZOS4 これは、8x8ピクセル周辺のLanczos補間です。 |
resizeメソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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)
Java DIP-オープンソースライブラリ
この章では、広く使用されており、プロジェクトに簡単に統合できる無料の画像処理ライブラリのいくつかを検討します。 これらのライブラリが含まれます-
- ImageJ
- Fiji
- コモンズイメージング
- ImageMagick
- エンドロフ
- LeadTools *OpenCv
ImageJ
ImageJは、Macintosh用NIH Imageに触発されたパブリックドメインJava画像処理プログラムです。 8ビット、16ビット、および32ビットの画像を表示、編集、分析、処理、保存、および印刷できます。
ImageJの基本的な機能のいくつかは以下に説明されています-
Sr.No. | Feature & Description |
---|---|
1 |
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ビットコンポーネントをカラーイメージにマージします。 |
Fiji
フィジーは画像処理パッケージです。 これは、Java、Java3D、および一貫したメニュー構造に編成された多くのプラグインとともに、ImageJ(およびImageJ2)の配布として説明できます。 UbuntuはLinuxと比較してフィジーはImageJと比較しています。
ImageJの基本的な機能とは別に、フィジーの高度な機能のいくつかを以下に説明します-
Sr.No. | Feature & Description |
---|---|
1 |
Registering 3D images これには、Elastic AlignmentとMontage、Feature Extraction、Image Stabilizerなどが含まれます。 |
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は簡単に使用できますが、実際に実装されている機能が必要な場合もありますが、トリガーする方法がわかりません。 |
コモンズイメージング
以前はApache Commons Sanselanとして知られていたApache Commons Imagingは、(サイズ、色、スペース、ICCプロファイルなど)やメタデータなどの画像情報の高速解析を含む、さまざまな画像形式を読み書きするライブラリです。
ImageJの基本的な機能のいくつかは以下に説明されています-
Sr.No. | Feature & Description |
---|---|
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 Software Licenseの下で利用可能です。 |
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の基本的な機能のいくつかは以下に説明されています-
Sr.No. | Feature & Description |
---|---|
1 |
画像をある形式から別の形式に変換します(例: 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の基本的な機能のいくつかを以下に説明します-
Sr.No. | Feature & Description |
---|---|
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は、ドキュメントのクリーンアップ、医療画像の強化、色変換と補正、ノイズ低減、エッジ検出などを含むいくつかのカテゴリで200以上の画像処理機能を提供します。
LEADTOOLSの基本的な機能のいくつかは以下で説明されます-
Sr.No. | Feature & Description |
---|---|
1 |
Scanned Document Image Processing この強力な機能のコレクションは、パンチ穴、斜めの角度、境界、ほこりの斑点など、アーチファクトや欠陥のスキャンされたドキュメントを読み取ることができます。 |
2 |
Medical Image Processing 背景をシフト、選択、減算、および削除することで画像を強化したり、細部を強調したりして、見やすくします。 |
3 |
Geometric Transformation これらの機能を使用して、画像のクリーニング、整列、修正、または芸術的な3D効果の適用を行うことができます。 |
4 |
Brightness and Contrast これらの機能を使用して、画像を強化したり、芸術的効果を適用したり、医療画像の診断評価に役立てることができます。 |
5 |
Color Space Conversion IISおよびWindows WFホストアプリケーションを含むシングルおよびマルチスレッドアプリケーションに画像の色空間機能を追加できます。 |
6 |
Color Correction これらの機能は、交換されたカラーチャンネルで画像を修正したり、色の強度のバランスをとったり、さまざまな画像分析タスクを実行したりするために使用されます。 |
7 |
Image Enhancement これらの機能は、赤目や不均衡な色などの写真の一般的なエラーを修正し、医療画像の診断評価に役立ちます。 |
8 |
Region of Interest これらの機能は、画像の関心領域を作成および変更して、画像の特定の部分で画像処理機能を実行し、バーコードの時間を節約し、OCR認識またはさまざまな画像分析タスクを実行するために使用されます。 |
OpenCV
OpenCVはBSDライセンスの下でリリースされているため、アカデミックおよび商用の両方で無料で使用できます。 C 、C、Python、およびJavaインターフェースを備え、Windows、Linux、Mac OS、iOS、およびAndroidをサポートします。 OpenCVは、計算効率とリアルタイムアプリケーションに重点を置いて設計されました。 最適化されたC/C で記述されたライブラリは、マルチコア処理を活用できます。
OpenCVのいくつかの基本的な機能は簡単に説明されています-
Sr.No. | Feature & Description |
---|---|
1 |
Smoothing Images これには、ぼかし、GaussianBlur、medianBlur、およびバイラテラルフィルターの適用が含まれます。 |
2 |
Eroding and Dilating 2つの非常に一般的な形態演算子-拡張と収縮を適用できます。 |
3 |
Morphology Transformations OpenCV関数morphologyExは、オープニング、クロージング、TopHat、BlackHatなどの形態変換を適用します。 |
4 |
Image Pyramids OpenCV関数pyrUpおよびpyrDownは、指定された画像をダウンサンプリングまたはアップサンプリングします。 |
4 |
Basic Thresholding Operations OpenCV関数のしきい値を使用して、基本的なしきい値操作を実行します。 |
5 |
Adding borders to your images OpenCV関数copyMakeBorderは、境界線(画像への余分なパディング)を設定するために使用されます。 |
7 |
Remapping OpenCVでは、関数remapは単純な再マッピングの実装を提供します。 |
8 |
Histogram Calculation 単純な目的のために、OpenCVは関数calcHistを実装します。これは、一連の配列(通常はイメージまたはイメージプレーン)のヒストグラムを計算します。 最大32次元で動作できます。 |
Java DIP-OpenCVの概要
OpenCVはBSDライセンスの下でリリースされているため、アカデミックおよび商用の両方で無料で使用できます。 C ++、C、Python、およびJavaインターフェースがあり、Windows、Linux、Mac OS、iOS、およびAndroidをサポートしています。
OpenCVは、計算効率とリアルタイムアプリケーションに重点を置いて設計されました。 最適化されたC/C ++で記述されたライブラリは、マルチコア処理を活用できます。
OpenCVの基本的な機能のいくつかを以下に説明します-
Sr.No. | Feature & Description |
---|---|
1 |
Smoothing Images これには、ぼかし、GaussianBlur、medianBlur、およびバイラテラルフィルターの適用が含まれます。 |
2 |
Eroding and Dilating 2つの非常に一般的な形態演算子-拡張と収縮を適用できます。 |
3 |
Morphology Transformations OpenCV関数morphologyExは、オープニング、クロージング、TopHat、BlackHatなどの形態変換を適用します。 |
4 |
Image Pyramids OpenCV関数pyrUpおよびpyrDownは、指定された画像をダウンサンプリングまたはアップサンプリングします。 |
4 |
Basic Thresholding Operations OpenCV関数のしきい値を使用して、基本的なしきい値操作を実行できます。 |
5 |
Adding borders to your images OpenCV関数copyMakeBorderを使用して、境界線を設定します(画像に余分なパディング)。 |
7 |
Remapping OpenCVでは、関数remapは単純な再マッピングの実装を提供します。 |
8 |
Histogram Calculation 単純な目的のために、OpenCVは関数calcHistを実装します。これは、一連の配列(通常はイメージまたはイメージプレーン)のヒストグラムを計算します。 最大32次元で動作できます。 |
OpenCVの統合
以下の手順では、OpenCVをアプリケーションに統合する方法について説明します。
OpenCVをダウンロード
OpenCVは、公式Webサイトhttps://opencv.org/[こちら]からダウンロードできます。
ユーザーライブラリを作成
さらに、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を選択し、[完了]をクリックします。
完了をクリックして完了です。
Java DIP-OpenCV GrayScale変換
OpenCVを使用してカラー画像をグレースケール画像に変換するには、画像を BufferedImage に読み込み、 Mat オブジェクトに変換します。 その構文は以下のとおりです-
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
その後、 Imgproc クラスでメソッド* cvtColor()*を使用して、RGB形式からグレースケール形式に画像を変換できます。 その構文は以下のとおりです-
Imgproc.cvtColor(source mat, destination mat1, Imgproc.COLOR_RGB2GRAY);
メソッド* cvtColor()*は、ソース画像マトリックス、宛先画像マトリックス、および色変換タイプの3つのパラメーターを取ります。
cvtColorメソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 それらは以下にリストされています-
Sr.No. | Method & Description |
---|---|
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 という名前でハードディスクに書き込みます。
元画像
グレースケール画像
Java DIP-OpenCV色空間変換
OpenCVを使用して1つの画像の色空間を別の画像に変更するには、画像を BufferedImage に読み込み、 Mat オブジェクトに変換します。 その構文は以下のとおりです-
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
//convert Buffered Image to Mat.
OpenCvでは、多くの色変換タイプを使用できますが、それらはすべてImgprocクラスにあります。 タイプのいくつかは簡単に説明されています-
Sr.No. | Color Conversion Type |
---|---|
1 | COLOR_RGB2BGR |
2 | COLOR_RGB2BGRA |
3 | COLOR_RGB2GRAY |
4 | COLOR_RGB2HLS |
5 | COLOR_RGB2HSV |
6 | COLOR_RGB2Luv |
7 | COLOR_RGB2YUV |
8 | COLOR_RGB2Lab |
任意の色変換タイプから、 Imgproc クラスのメソッド* cvtColor()*に適切なものを渡すだけです。 その構文は以下のとおりです-
Imgproc.cvtColor(source mat, destination mat1, Color_Conversion_Code);
メソッド* cvtColor()*は、ソース画像マトリックス、宛先画像マトリックス、および色変換タイプの3つのパラメーターを取ります。
cvtColor()メソッドとは別に、Imgprocクラスによって提供される他のメソッドがあります。 彼らは簡単に説明されています-
Sr.No. | Method & Description |
---|---|
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 という名前でハードディスクに書き込みます。