2024.08.01

空間フィルタリング(spatial filtering)

はじめに

ここでは、画像に対する空間フィルタリングについて説明します。

空間フィルタリング画像フィルタリング)は、注目画素の周辺の画素を利用して濃淡を変換することです。

画像ノイズを軽減したり、色の境界線を強調したり、画像ぼかしたりすることができます。

空間フィルタリングの説明

それでは、空間フィルタリングについて詳しく説明していきます。

下の図は、変換前のフルカラー画像の一部を拡大したものです。1つの正方形が1つの画素です。

画像の一部を拡大

空間フィルタリング処理は、1つの画素に注目して濃淡を変換します。その変換対象の画素注目画素といい、濃淡を変換するために注目画素の周辺の画素近傍画素を使用します。

下の図は、注目画素を表したもので、赤い枠で囲んでいます。

注目画素

一般的に、縦と横の画素数が同じで奇数近傍画素が良く使われます。具体的には、3x3画素5x5画素7x7画素9x9画素です。

以下は、注目画素を中心とした3x3画素を使用した近傍画素を表したもので、青い枠で囲んでいます。この注目画素近傍画素を組み合わせたものをカーネルといいます。また、オペレータ、マスクとも呼びます。

この青い枠で囲まれた範囲の画素色情報を使って注目画素の濃淡を計算します。

注目画素の周りの画素(3x3画素)
注目画素の周りの画素(3x3画素)

近傍画素3x3画素の場合、以下のように3x3の空間フィルタを設定します。kは係数です。

空間フィルタ(3x3画素)
空間フィルタ(3x3画素)

注目画素と、空間フィルタの中心を重ね合わせて積和演算を行います。

以下のフルカラー画像を例に、注目画素の濃淡を積和計算する方法を説明します。

注目画素の周りの画素(3x3)-RGB

上の図のようにフルカラー画素の色は、R値とG値とB値の3つで表されています。

注目画素のそれぞれの値と、空間フィルタ積和計算を行い、濃淡を求めます。

	注目画素のR値 = 235 x k00 + 226 x k01 + 231 x k02
	       + 240 x k10 + 198 x k11 + 200 x k12
	       + 237 x k20 + 255 x k21 + 228 x k22

	注目画素のG値 = 226 x k00 + 221 x k01 + 222 x k02
	       + 186 x k10 + 147 x k11 + 137 x k12
	       + 143 x k20 + 183 x k21 + 133 x k22

	注目画素のB値 = 161 x k00 + 140 x k01 + 131 x k02
	       + 126 x k10 +   82 x k11 +   66 x k12
	       +   91 x k20 + 131 x k21 +   75 x k22

画素色情報であるRGBの値ごとに、計算に使用する空間フィルタを設定することもできます。

カーネルの範囲のR値(3x3画素)
カーネルの範囲のR値(3x3画素)
カーネルの範囲のG値(3x3画素)
カーネルの範囲のG値(3x3画素)
カーネルの範囲のB値(3x3画素)
カーネルの範囲のB値(3x3画素)

RGBごとに設定した空間フィルタのの積和計算は、以下の式で計算できます。

	注目画素のR値 = 235 x R00 + 226 x R01 + 231 x R02
	       + 240 x R10 + 198 x R11 + 200 x R12
	       + 237 x R20 + 255 x R21 + 228 x R22

	注目画素のG値 = 226 x G00 + 221 x G01 + 222 x G02
	       + 186 x G10 + 147 x G11 + 137 x G12
	       + 143 x G20 + 183 x G21 + 133 x G22

	注目画素のB値 = 161 x B00 + 140 x B01 + 131 x B02
	       + 126 x B10 +   82 x B11 +   66 x B12
	       +   91 x B20 + 131 x B21 +   75 x B22

次に、注目画像の位置が画像の上辺/下辺/左辺/右辺の場合の処理について説明します。

下の図は、注目が画素の位置が画像の左上(0,0)にある例です。この場合、3x3の空間フィルタ内の全ての画素RGB値を取得することができません。

このように、注目画素の位置が上辺/下辺/左辺/右辺にある場合は、空間フィルタ内の一部のRGB値を取得することができません。

空間フィルタ注目画素の周りの画素(3x3)-RGB

では、どのように処理するのか。

ここでは、空間フィルタの中で取得できないRGB値は、注目画素RGB値を使うことにします。

注目画素の周りの画素(3x3)-RGB

この他にも、取得できない画素の位置に最も近い画素RGB値を使う方法もあります。

空間フィルタの種類

一般的に使われている3x3のぼかし系フィルタと、色の境界を検出するエッジ抽出系のフィルタを紹介します。

ぼかし系のフィルタ

ノイズを軽減したり、スムージング(平滑化)を目的に使われます。

ここでは、平均化フィルタGaussian(ガウシアン)フィルタを紹介します。

平均化フィルタ
平均化フィルタ
 
ガウシアンフィルタ
ガウシアンフィルタ

エッジ抽出系のフィルタ

色の境界を検出するためのもの、物や形状の輪郭を検出するのに使われます。

ここでは、Sobel(ソーベル)フィルタ微分フィルタLaplacian(ラプラシアン)フィルタPrewitt(プレヴィット)フィルタを紹介します。

ソーベルフィルタ(横方向)
ソーベルフィルタ(横方向)
 
ソーベルフィルタ(縦方向)
ソーベルフィルタ(縦方向)
微分フィルタ(横方向)
微分フィルタ(横方向)
 
微分フィルタ(縦方向)
微分フィルタ(縦方向)
ラプラシアンフィルタ(4方向)
ラプラシアンフィルタ(4方向)
 
ラプラシアンフィルタ(8方向)
ラプラシアンフィルタ(8方向)
プレヴィットフィルタ(横方向)
プレヴィットフィルタ(横方向)
 
プレヴィットフィルタ(縦方向)
プレヴィットフィルタ(縦方向)

Javaソースコード

元の画像ファイル名と、出力する画像ファイル名と、3x3の空間フィルタの値を渡して、空間フィルタリングを行うソースコード例です。

空間フィルタの9つの値は、k00 k01 k02 k10 k11 k12 k20 k21 k22の順番で渡します。

このソースコードは、画像を操作するMyBufferedImage0クラスを使用しているので、以下に記載のソースコードが必要です。

BufferedImageクラスを利用して、利便性の高い画像操作クラスを作成しました。興味のある方は、是非ご覧ください。

2022.11.16

MyBufferedImage0.java」を取得してコンパイルしてください。

MySpatialFilter3.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import java.awt.image.BufferedImage;

public class MySpatialFilter3 {
	// 空間フィルタリング(3x3)を行い、注目画素の色を計算するメソッド
	private static int getColor( MyBufferedImage0 img, int x, int y, double[] filter )
	{
		// 変数の宣言
		double sum_r, sum_g, sum_b;
		double f;

		// 注目画素の色をdefcolorに代入
		// 座標(x,y)が画像外の場合、colorに0xffffffff(白色)が代入される。
		int defcolor = img.getRGB( x, y, 0xffffffff );

		// 注目画素の色を計算
		sum_r = sum_g = sum_b = 0.0;
		for ( int dy = -1; dy <= 1; dy++ ) {
			for ( int dx = -1; dx <= 1; dx++ ) {
				// 空間フィルタの値を取得
				f = filter[ ( dx + 1 ) + ( dy + 1 ) * 3 ];

				// 色を取得
				// 座標(x+dx,y+dy)が画像外の場合、colorにdefcolorが代入される
				int color = img.getRGB( x + dx, y + dy, defcolor );

				// 色をr,g,bに分解
				int r = ( color >> 16 ) & 0xff;
				int g = ( color >> 8 ) & 0xff;
				int b = color & 0xff;

				// RGB値に空間フィルタの値を掛けて足す
				sum_r +=  (double)r * f;
				sum_g +=  (double)g * f;
				sum_b +=  (double)b * f;
			}
		}

		// 計算したRGBの値をそれぞれ0~255の値に収める
		if ( 0.0 > sum_r ) sum_r = 0.0;
		if ( 255.0 < sum_r ) sum_r = 255.0;
		if ( 0.0 > sum_g ) sum_g = 0.0;
		if ( 255.0 < sum_g ) sum_g = 255.0;
		if ( 0.0 > sum_b ) sum_b = 0.0;
		if ( 255.0 < sum_b ) sum_b = 255.0;

		// RGBの値を合成して戻す
		return (  (int)sum_r << 16 ) + (  (int)sum_g << 8 ) +  (int)sum_b;
	}


	// メインメソッド
	public static void main(String[] args) {
		// ファイル名
		String inname, outname;

		// 空間フィルタ
		double filter[] = new double[ 9 ];

		// 入力した引数が11以上かを調べる
		if ( 11 > args.length ) {
			// 入力した引数が11未満の場合、使用方法を表示する
			System.out.println( "MySpatialFilter3 [入力画像名]  [出力JPG名]  k00  k01  k02  k10  k11  k12  k20  k21  k22" );
			return;
		}

		// 入力画像名をinnameに代入(拡張子省略なし)
		inname  = args[ 0 ];
		// 出力JPG名をoutnameに代入(拡張子".jpg"省略なし)
		outname = args[ 1 ];

		// 空間フィルタの設定
		for ( int i = 0; i < 9; ++ i ) {
			filter[ i ] = Double.parseDouble( args[ i + 2 ] );
		}

		// 画像操作クラスを作成(元画像格納用)
		MyBufferedImage0 img_src = new MyBufferedImage0();

		// 画像の読み込み
		if ( !img_src.read( inname ) ) {
			System.out.println( "読み込みに失敗しました!(" + inname +")" );
			return;
		}

		// 読み込んだ画像のサイズ
		int w = img_src.getWidth();
		int h = img_src.getHeight();

		// 画像操作クラスを作成(変換後画像格納用)
		MyBufferedImage0 img_des = new MyBufferedImage0();
		if ( false == img_des.create( w, h, BufferedImage.TYPE_INT_RGB ) ) {
			System.out.println( "画像の作成に失敗しました!" );
			return;
		}
	
		// 空間フィルタリング
		for ( int y = 0; y < h; y++ ) {
			for ( int x = 0; x < w; x++ ) {
				// 色を取得
				int color = getColor( img_src, x, y, filter );
				int r = MyBufferedImage0.getR( color );
				int g = MyBufferedImage0.getG( color );
				int b = MyBufferedImage0.getB( color );

				// 変換した色を設定
				img_des.setRGB( x, y, r, g, b );
			}
		}

		// JPG画像の保存
		if ( !img_des.writeJPG( outname ) ) {
			System.out.println( "保存に失敗しました!(" + outname +")" );
			return;
		}

		// 正常に終了
		System.out.println( "正常に終了しました" );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis MySpatialFilter3.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac MySpatialFilter3.java

以下の例は、元画像に対して空間フィルタリング処理を行った結果です。

元画像
元画像

実行例 - 平均化フィルタ

java MySpatialFilter3 sampleimage001_400x320.jpg spatialfilter_box.jpg 0.11111 0.11111 0.11111 0.11111 0.11111 0.11111 0.11111 0.11111 0.11111

フィルタの値の1/9は、0.11111で渡しています。

平均化フィルタ
平均化フィルタ

実行例 - ガウシアンフィルタ

java MySpatialFilter3 sampleimage001_400x320.jpg spatialfilter_gauss.jpg 0.0625 0.125 0.0625 0.125 0.25 0.125 0.0625 0.125 0.0625
ガウシアンフィルタ
ガウシアンフィルタ

実行例 - ソーベルフィルタ(横方向)

java MySpatialFilter3 sampleimage001_400x320.jpg spatialfilter_sobel-x.jpg -1 0 1 -2 0 2 -1 0 1
ソーベルフィルタ(横方向)
ソーベルフィルタ(横方向)

実行例 - ソーベルフィルタ(縦方向)

java MySpatialFilter3 sampleimage001_400x320.jpg spatialfilter_sobel-y.jpg -1 -2 -1 0 0 0 1 2 1
ソーベルフィルタ(縦方向)
ソーベルフィルタ(縦方向)

実行例 - 微分フィルタ(横方向)

java MySpatialFilter3 sampleimage001_400x320.jpg spatialfilter_difference-x.jpg 0 0 0 -0.5 0 0.5 0 0 0
微分フィルタ(横方向)
微分フィルタ(横方向)

実行例 - 微分フィルタ(縦方向)

java MySpatialFilter3 sampleimage001_400x320.jpg spatialfilter_difference-y.jpg 0 -0.5 0 0 0 0 0 0.5 0
微分フィルタ(縦方向)
微分フィルタ(縦方向)

実行例 - ラプラシアンフィルタ(4方向)

java MySpatialFilter3 sampleimage001_400x320.jpg spatialfilter_laplacian-4.jpg 0 1 0 1 -4 1 0 1 0
ラプラシアンフィルタ(4方向)
ラプラシアンフィルタ(4方向)

実行例 - ラプラシアンフィルタ(8方向)

java MySpatialFilter3 sampleimage001_400x320.jpg spatialfilter_laplacian-8.jpg 1 1 1 1 -8 1 1 1 1
ラプラシアンフィルタ(8方向)
ラプラシアンフィルタ(8方向)

Javaソースコードの解説

ここからは、このJavaソースコードを上から順番に解説していきます。

001
import java.awt.image.BufferedImage;

Javaクラスライブラリの中から「java.awt.image.BufferedImage」というパッケージにあるクラスを、このプログラム内で使うために記述します。

この記述により、BufferedImageクラスが利用できるようになります。

003
public class MySpatialFilter3 {

クラス名を、MySpatialFilter3としています。

004
005
	// 空間フィルタリング(3x3)を行い、注目画素の色を計算するメソッド
	private static int getColor( MyBufferedImage0 img, int x, int y, double[] filter )

空間フィルタリングを行うメソッドgetColorです。

画像を格納するオブジェクトimg、注目画素座標(x,y)、空間フィルタの値を格納したdouble型配列filterを渡して、計算後の注目画素の色を戻します。

007
008
009
		// 変数の宣言
		double sum_r, sum_g, sum_b;
		double f;

メソッドgetColorで使用する変数を宣言しています。

double型変数sum_r/sum_g/sum_bには、RGBの値に空間フィルタの値を掛けたものを足したものを代入します。

double型変数fには、計算に使用する空間フィルタの値を一時的に代入します。

011
012
013
		// 注目画素の色をdefcolorに代入
		// 座標(x,y)が画像外の場合、colorに0xffffffff(白色)が代入される。
		int defcolor = img.getRGB( x, y, 0xffffffff );

注目画素(x,y)の色を取得して、int型変数defcolorに代入しています。defcolorは、RGBの値を合成したものです。

ここでは、座標(x,y)が画像の外側になることはないですが、外側の場合はgetRGBメソッドの3番目の引数0xffffffff(白色)がdefcolorに代入されます。

015
016
		// 注目画素の色を計算
		sum_r = sum_g = sum_b = 0.0;

ここから注目画素(x,y)のRGB値の計算です。

計算結果は、sum_rとsum_gとsum_bに格納されます。ここでは、初期値0.0を代入しています。

017
018
		for ( int dy = -1; dy <= 1; dy++ ) {
			for ( int dx = -1; dx <= 1; dx++ ) {

注目画素座標(x,y)を中心に3x3の積和計算を行うために、dyとdyを-1から1へ変化させる2重ループを作成しています。

019
020
				// 空間フィルタの値を取得
				f = filter[ ( dx + 1 ) + ( dy + 1 ) * 3 ];

座標(x+dx,y+dy)に対応した空間フィルタの値をdouble型変数fに代入しています。

空間フィルタの値を格納しているfilterは1次元配列なので、dxとdyの値から配列添え字を以下の式で計算しています。

空間フィルタ配列(3x3)の添え字 = ( dx + 1 ) + ( dy + 1 ) x 3

空間フィルタの左上(dx=-1,dy=-1)の値が格納されている配列添え字は、

	( -1 + 1 ) + ( -1 + 1 ) x 3 = 0

空間フィルタの右下(dx=1,dy=1)の値が格納されている配列添え字

	( 1 + 1 ) + ( 1 + 1 ) x 3 = 8

で計算することができます。

ちなみに、5x5のフィルタの場合の配列添え字は、

空間フィルタ配列(5x5)の添え字 = ( dx + 2 ) + ( dy + 2 ) x 5

で計算することができます。

022
023
024
				// 色を取得
				// 座標(x+dx,y+dy)が画像外の場合、colorにdefcolorが代入される
				int color = img.getRGB( x + dx, y + dy, defcolor );

座標(x+dx,y+dy)の色を取得してcolorに代入しています。(x+dx,y+dy)が画像の外側の場合はgetRGBメソッドの3番目の引数defcolorがcolorに代入されます。

defcolorは、座標(x,y)に色です。

026
027
028
029
				// 色をr,g,bに分解
				int r = ( color >> 16 ) & 0xff;
				int g = ( color >> 8 ) & 0xff;
				int b = color & 0xff;

変数colorに入っている色情報を赤(R)、緑(G)画、青(B)の成分に分解し、それぞれ変数r、g、bに代入しています。

色の分解方法の詳細はこちらを参照してください。

24ビット(フルカラー)、32ビットカラーからR(赤)、G(緑)、B(青)、A(アルファ値)を抽出する方法を説明しています。

2020.03.23
031
032
033
034
				// RGB値に空間フィルタの値を掛けて足す
				sum_r +=  (double)r * f;
				sum_g +=  (double)g * f;
				sum_b +=  (double)b * f;

ここが積和計算です。

変数rにfを掛けた値をsum_rに足して、変数gにfを掛けた値をsum_gに足して、変数bにfを掛けた値をsum_bに足しています。

038
039
040
041
042
043
044
		// 計算したRGBの値をそれぞれ0~255の値に収める
		if ( 0.0 > sum_r ) sum_r = 0.0;
		if ( 255.0 < sum_r ) sum_r = 255.0;
		if ( 0.0 > sum_g ) sum_g = 0.0;
		if ( 255.0 < sum_g ) sum_g = 255.0;
		if ( 0.0 > sum_b ) sum_b = 0.0;
		if ( 255.0 < sum_b ) sum_b = 255.0;

積和計算で得られたsum_r、sum_g、sum_bの値を0.0から255.0の間に収めています。

0.0未満の値は0.0、255.0を超える値は255.0にしています。

046
047
		// RGBの値を合成して戻す
		return (  (int)sum_r << 16 ) + (  (int)sum_g << 8 ) +  (int)sum_b;

変数sum_r、sum_g、sum_bの値を合成した値をreturn文で戻しています。

合成する際に、変数sum_r、sum_g、sum_bの前に(int)を付けてint型キャストしています。

051
052
	// メインメソッド
	public static void main(String[] args) {

このmainメソッドからプログラムを実行します。

053
054
055
056
057
		// ファイル名
		String inname, outname;

		// 空間フィルタ
		double filter[] = new double[ 9 ];

このプログラムで使う変数を宣言しています。

String型のinnameは、入力画像(元画像)のファイル名を、outnameは、出力画像ファイル名を格納します。

double型配列filterは、3x3の空間フィルタの値を格納します。

059
060
061
062
063
064
		// 入力した引数が11以上かを調べる
		if ( 11 > args.length ) {
			// 入力した引数が11未満の場合、使用方法を表示する
			System.out.println( "MySpatialFilter3 [入力画像名]  [出力JPG名]  k00  k01  k02  k10  k11  k12  k20  k21  k22" );
			return;
		}

11個以上の引数が与えられたかをチェックし、11未満の場合に、使い方のメッセージを表示し、return文によってmainメソッドを抜けています。

11個のパラメータは、入力画像ファイル名、出力JPG画像ファイル名、3x3の空間フィルタの値9個です。

066
067
068
069
070
071
072
073
074
		// 入力画像名をinnameに代入(拡張子省略なし)
		inname  = args[ 0 ];
		// 出力JPG名をoutnameに代入(拡張子".jpg"省略なし)
		outname = args[ 1 ];

		// 空間フィルタの設定
		for ( int i = 0; i < 9; ++ i ) {
			filter[ i ] = Double.parseDouble( args[ i + 2 ] );
		}

与えられた引数をそれぞれ、入力画像ファイル名inname、出力JPG画像ファイル名outname、3x3の空間フィルタの値filterに代入しています。

076
077
		// 画像操作クラスを作成(元画像格納用)
		MyBufferedImage0 img_src = new MyBufferedImage0();

画像を操作するMyBufferedImage0クラスの実体img_srcを作成しています。

img_srcは、元画像を格納するオブジェクトです。

079
080
081
082
083
		// 画像の読み込み
		if ( !img_src.read( inname ) ) {
			System.out.println( "読み込みに失敗しました!(" + inname +")" );
			return;
		}

MyBufferedImage0.readメソッドで、画像ファイルinnameをimg_srcに読み込んでいます。

MyBufferedImage0.readメソッド

boolean read( String imgname )
・指定した画像ファイルを読み込みます。

  パラメータ imgname  : フルパスの画像ファイル名(拡張子は省略不可)

  戻り値    true   : 画像の読み込みに成功
         false  : 画像の読み込みに失敗
085
086
087
		// 読み込んだ画像のサイズ
		int w = img_src.getWidth();
		int h = img_src.getHeight();

img_srcに読み込んだ画像の幅を変数w、高さを変数hに代入しています。

MyBufferedImage0.getWidthメソッド

public int getWidth()
・画像の横のピクセルサイズを返します。

  パラメータ なし

  戻り値     画像の横ピクセル数

MyBufferedImage0.getHeightメソッド

public int getHeight()
・画像の縦のピクセルサイズを返します。

  パラメータ なし

  戻り値     画像の縦ピクセル数
089
090
		// 画像操作クラスを作成(変換後画像格納用)
		MyBufferedImage0 img_des = new MyBufferedImage0();

画像を操作するMyBufferedImage0クラスの実体img_desを作成しています。

img_desは、空間フィルタリングを行った画像を格納するオブジェクトです。

091
092
093
094
		if ( false == img_des.create( w, h, BufferedImage.TYPE_INT_RGB ) ) {
			System.out.println( "画像の作成に失敗しました!" );
			return;
		}

MyBufferedImage0.createメソッドで、幅w、高さh、24ビットカラー(BufferedImage.TYPE_INT_RGB)の画像img_desを作成しています。

MyBufferedImage0.createメソッド

boolean create( int width, int height, int type )
・指定したサイズ、種類の画像を作成します。

  パラメータ width  : 作成する画像の横のピクセル数
        height : 作成する画像の縦のピクセル数
        type   : 作成するイメージの形式
           指定例) BufferedImage.TYPE_INT_RGB

  戻り値    true   : 画像の作成に成功
         false  : 画像の作成に失敗
096
097
098
		// 空間フィルタリング
		for ( int y = 0; y < h; y++ ) {
			for ( int x = 0; x < w; x++ ) {

for文2重ループでを作成しています。

画像全体のピクセル座標(xは0~w-1、yは0~h-1)を処理するループにしています。

099
100
				// 色を取得
				int color = getColor( img_src, x, y, filter );

注目画素座標(x,y)の色を計算するメソッドgetColorの戻り値int型変数colorに代入しています。

色の計算には、img_srcを使用します。

101
102
103
				int r = MyBufferedImage0.getR( color );
				int g = MyBufferedImage0.getG( color );
				int b = MyBufferedImage0.getB( color );

変数colorの赤成分r、緑成分g、青成分bに分解しています。

MyBufferedImage0.getRメソッド

static int getR( int color )
・RGBを合成した色からR成分(赤の輝度)だけを抽出します。

  パラメータ color  : RGBを合成した色

  戻り値    赤の輝度

MyBufferedImage0.getGメソッド

static int getG( int color )
・RGBを合成した色からG成分(緑の輝度)だけを抽出します。

  パラメータ color  : RGBを合成した色

  戻り値    緑の輝度

MyBufferedImage0.getBメソッド

static int getB( int color )
・RGBを合成した色からB成分(青の輝度)だけを抽出します。

  パラメータ color  : RGBを合成した色

  戻り値    青の輝度
105
106
				// 変換した色を設定
				img_des.setRGB( x, y, r, g, b );

赤成分r、緑成分g、青成分bをimg_desの(x,y)に設定しています。

MyBufferedImage0.setRGBメソッド

boolean setRGB( int x, int y, int color )
・指定した座標の色を設定します。

  パラメータ x  : ピクセルのx座標
        y  : ピクセルのy座標
        color   : 設定するRGBを合成した色

  戻り値    (x,y)が画像の範囲内の場合、true
         (x,y)が画像の範囲外の場合、false
boolean setRGB( int x, int y, int r, int g, int b )
・指定した座標の色を設定します。

  パラメータ x  : ピクセルのx座標
        y  : ピクセルのy座標
        r  : 赤の輝度
        g  : 緑の輝度
        b  : 青の輝度

  戻り値    (x,y)が画像の範囲内の場合、true
         (x,y)が画像の範囲外の場合、false

  詳細         r、g、bは自動で0~255の範囲に変換されます。
110
111
112
113
114
		// JPG画像の保存
		if ( !img_des.writeJPG( outname ) ) {
			System.out.println( "保存に失敗しました!(" + outname +")" );
			return;
		}

img_desをファイル名outnameで保存しています。

MyBufferedImage0.writeJPGメソッドを使用してJPEG形式で保存しています。

MyBufferedImage0.writeJPGメソッド

boolean writeJPG( String imgname )
・画像をJPEG形式のファイルで保存します。

  パラメータ imgname  : フルパスのJPEG画像ファイル名

  戻り値    true   : 画像の読み込みに成功
         false  : 画像の読み込みに失敗
116
117
		// 正常に終了
		System.out.println( "正常に終了しました" );

保存に成功したメッセージをprintlnコンソール出力しています。全ての処理が正常終了すると、ここまで処理が実行されます。

全ての処理が正常終了すると、ここまで処理が実行されます。

以上です。

関連コンテンツ

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

九九(くく)の表を作る方法を詳しく解説しています。ソースコード付きです。

2019.01.03

割り算で割り切れずに残った端数を剰余(余り)といいます。この剰余の計算をJavaのソースコードを使って解説しています。

2020.03.23

条件式を判断して処理を分岐する方法を詳しく説明しています。

2023.03.20

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

Javaのmainメソッドで受け取るパラメータについて解説しています。

2017.09.26

mainメソッドで受け取るパラメータの数の取得の仕方について解説しています。

2019.05.14

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

画像って何?

2022.07.25

デジタル画像データを構成している要素について解説しています。

2015.12.22

乱数を使って指定サイズのノイズ画像を作る方法を解説します。Javaのソースコード付きです。

2016.05.26

画像全体をぼやけた感じにする処理のJavaソースコードを紹介しています。、

2016.08.09

PCやスマートフォンのディスプレイに表示されている色、プリンターで印刷される色の仕組みについて解説しています。

2020.03.23

正方形の面積、周の長さ、関連する記事を紹介しています。興味のある方は、ご覧ください。

2020.03.23

偶数・奇数を判定する方法を詳しく説明しています。興味のある方は、ご覧ください。

2015.11.17

カラー画像の輪郭だけを残すプログラムを作ってみませんか?

2019.04.04

一般に使われている画像フォーマットには、いろいろな種類があります。画像フォーマットBMP、JPEG、PNG、GIF、TIFFの特徴を知ってますか?

2015.11.29

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

同じ型の変数(データ)を複数個まとめて管理するデータの持ちかたがあります。これが配列です。くわしくは、記事をご覧ください。

2016.01.14

平面上の位置を表す座標系の1つXY座標系について詳しく解説。

2020.03.23

オブジェクト指向の考え方を、Javaのソースコードを使って詳しく解説しています。興味のある方は、是非ご覧ください。

2022.09.02

for文などのループ中に、さらにループがある多重ループについて解説しています。

2021.02.09

データの型を変換する方法を詳しく解説しています。例)int型 → long型

2015.11.01

コンピュータに保存されたファイルを特定するための名前がファイル名です。その付け方は?

2016.11.23

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

画像の座標系はどのように定義されていますか?

2020.03.23

繰り返し処理の作り方を解説しています。

2016.03.02

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

広告