画像処理におけるモルフォロジカルグラディエント(形態学的勾配)とは?
収縮(Erosion)と膨張(Dilation)は、モルフォロジー(形態学)操作における2つの基本的な処理です。その名の通り、モルフォロジー操作とは、画像をその「形状」に基づいて処理する一連の操作を指します。
膨張と収縮の基本
膨張操作では、画像の境界部分に新たなピクセルが追加されます。一方、収縮操作では、画像の境界からピクセルが除去されます。膨張処理によって追加されるピクセルの総数は、使用する構造要素(カーネル)のサイズや形状によって決まります。
モルフォロジカルグラディエントとは
モルフォロジカルグラディエント(形態学的勾配)とは、「画像の膨張結果」と「画像の収縮結果」の差分を取る操作です。
この操作によって得られる画像の各ピクセル値は、その位置における近傍ピクセル間のコントラストの強さを表しています。つまり、明暗の変化が大きい領域ほど高い値を持つため、以下のような用途で活用されています。
- エッジ検出
- 画像のセグメンテーション
- 物体の輪郭(アウトライン)抽出
OpenCVでは、Imgproc.morphologyEx() メソッドに Imgproc.MORPH_GRADIENT フラグを指定するだけで、この操作を簡単に実行できます。
Javaによる実装例
次のJavaサンプルコードは、指定した画像に対してモルフォロジカルグラディエントを適用し、その結果をウィンドウ上に表示するプログラムです。
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class MorphologicalGradient extends Application {
public void start(Stage stage) throws IOException {
// OpenCVのコアライブラリを読み込む
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
// 画像データを読み込む
String file ="D:\\Images\\morph_input1.jpg";
Mat src = Imgcodecs.imread(file);
// 出力用の行列を作成
Mat dst = new Mat(src.rows(), src.cols(), src.type());
// カーネル(構造要素)を準備
Mat kernel = Mat.ones(5,5, CvType.CV_32F);
// モルフォロジカルグラディエントを適用
Imgproc.morphologyEx(src, dst, Imgproc.MORPH_GRADIENT, kernel);
// 行列をJavaFXのWritableImageへ変換
Image img = HighGui.toBufferedImage(dst);
WritableImage writableImage = SwingFXUtils.toFXImage((BufferedImage) img, null);
// ImageViewの設定
ImageView imageView = new ImageView(writableImage);
imageView.setX(10);
imageView.setY(10);
imageView.setFitWidth(575);
imageView.setPreserveRatio(true);
// Sceneオブジェクトの設定
Group root = new Group(imageView);
Scene scene = new Scene(root, 595, 400);
stage.setTitle("Morphological Gradient");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]) {
launch(args);
}
}
入力画像

出力画像

この例では、5×5のカーネルを使用してモルフォロジカルグラディエントを計算しています。出力画像を見ると、元画像の物体の輪郭部分が明るく強調され、背景との境界線がくっきりと抽出されていることがわかります。カーネルサイズを変更することで、検出されるエッジの太さや感度を調整することも可能です。
-
OpenCVとJavaFXで画像の鮮明さを変更するアプリケーションの作成方法
画像のシャープ化(鮮明化)は、ぼかし処理とは正反対の操作です。OpenCVライブラリを使って画像の鮮明さを変更するには、まずガウシアンフィルタで元画像を平滑化(ぼかし)し、次にその平滑化した画像を元画像から減算します。この処理により、輪郭やディテールが強調され、画像全体がくっきりとした印象になります。 仕組みのポイント 本記事のサンプルでは、Core.addWeighted()メソッドを使って元画像と平滑化画像を加重合成しています。第2引数のalphaは元画像の重み、第4引数のbetaは平滑化画像の重みです。betaを負の値に設定すると、平滑化成分が元画像から差し引かれ、シャープ化効果が得ら
-
Pythonでの画像処理入門!PillowとOpenCVで学ぶ基本操作
Pythonには、画像処理に役立つ豊富なライブラリが用意されています。代表的なものは以下の通りです。 OpenCV − リアルタイムコンピュータビジョンを主眼とした画像処理ライブラリ。2D・3D特徴量ツールキット、顔認識やジェスチャー認識、ヒューマンコンピュータインタラクション、モバイルロボティクス、物体識別など、幅広い分野で活用されています。 NumPy / SciPy − 画像の操作や処理に利用される数値計算ライブラリ。 scikit-image − 画像処理向けの多数のアルゴリズムを提供するライブラリ。 Pillow(Python Imaging Library) − サムネイル作成、