【Python/OpenCV】微分フィルタの注意点(負の値の処理)

Python版OpenCVの微分フィルタ(Sobelなど)を利用する時の注意点についてソースコード付きで解説します。

微分フィルタの注意点(負の値の処理)

微分フィルタで画像の勾配を計算すると、黒(0)→白(255)へ変化するときの微分値は正、その逆は負になります。OpenCVの微分フィルタの関数(cv2.Sobel、filter2Dなど)では、デフォルトのデータ型(8ビット符号なし整数)で使用すると、負の値は0になります。つまり、負の勾配(白→黒)の情報を失ってしまいます

負の勾配情報を残すには、データ型をfloat64(cv2.CV_64F)などに変換してやります。

サンプルコード

サンプルコードと実行結果を見てみましょう。


実行結果

■入力画像(左)、負の値が0になった出力画像(中)、負の値を正にした出力画像(右)

負の値を正にした出力画像のほうが輪郭が全体的に強調されていることがわかります。

コード解説

ポイントは、float64で微分画像の配列を取り出した後、次の1行で配列内の要素の絶対値を求めるところです。

np.uint8(np.abs(dst2))

これで負の値は正に変換され(例:-255 → +255)、データ型を符号なし8ビット整数に戻してからcv2.imwrite()で画像を出力します。つまり、白→黒の勾配も出力画像に反映できます。

関連ページ

【PythonとOpenCVで画像処理超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
Python基礎
「Python基礎」の記事一覧です。
この記事を書いた人
西住技研

Python使用歴10年以上。研究、仕事、趣味でデータ分析や作業自動化などに活用してきたノウハウを情報発信しています。
詳しいプロフィールやお問合せはこちらのページまで。
YoutubeX(旧Twitter)でも情報発信中です!

西住技研をフォローする
OpenCV

コメント