(デジタル画像処理 MATLAB+Python) 第 3 章 基本的な画像操作 - セクション 2: 画像代数操作

1: 画像演算

(1) 加算演算

A: 概要

加算演算: 新しい画像を取得するために、同じサイズの 2 つの画像のピクセル レベルの加算演算を指します。2 つの画像の対応するピクセル値をf 1 ( x , y ) f_{1}(x,y)とする1( x ,y )f 2 ( x , y ) f_{2}(x,y)2( x ,y )の場合、それらの加算操作は次のように表すことができます。

g ( x , y ) = f 1 ( x , y ) + f 2 ( x , y ) g(x,y)=f_{1}(x,y) + f_{2}(x,y)g ( x ,=1( x ,+2( x ,

画像加算演算を行う場合、主に以下のような合計値の処理方法があります

  • 切り捨て処理: 2 つの画像の対応するピクセル値を加算した結果が画像の最大グレー レベルを超える場合、結果は強制的に最大グレー レベルに切り捨てられます。たとえば、8 ビット グレースケール画像では、最大値は 255 です
  • 加重合計: 異なる位置のピクセル値を単純に加算するだけでなく、特定のアプリケーション要件をより適切に満たすために、異なる位置の重みに従って重み付けする必要があります
  • スケーリング処理: 2 つの画像の対応するピクセル値を指定されたグレースケール範囲に加算した結果をスケーリングします。たとえば、8 ビットのグレースケール画像では、255 を超えないように結果を係数で除算します。
  • オーバーフロー処理: 2 つの画像の対応するピクセル値を加算した結果が、画像のグレースケールの最大値を超えた場合、結果は自動的に次のレベルにオーバーフローされます.たとえば、8 ビットのグレースケール画像ではオーバーフローがレベル 9 に達すると、ピクセル値は 0 になり、オーバーフローがレベル 10 に達すると、ピクセル値は 1 になります。
  • 彩度処理: 2 つの画像の対応するピクセル値を加算した結果が、画像のグレースケールの最大値を超える場合、結果を最大値に設定します。この処理はオーバーフロー処理とも呼ばれ、アンダーフロー処理は結果を 0 に設定します。

ここに画像の説明を挿入

画像追加の主な用途は次のとおりです。

  • 画像強調: 画像を明るいまたは暗い画像に追加することで、画像のコントラストと明るさを強調して、より鮮明で明るい画像にすることができます
  • 画像融合: 異なる角度または異なる帯域からの 2 つの画像を重み付けして処理することで、画像の品質と情報量を改善するために使用される融合画像を取得できます。
  • ターゲット検出: 異なるスケールまたは異なる方向の画像を重み付けして処理することで、ターゲットの位置と形状を検出するための新しい画像を取得できます
  • ノイズ除去: 滑らかな画像またはぼやけた画像に画像を追加することにより、画像のノイズを抑制し、画像の信号対雑音比を改善できます。
  • カラー画像の生成: 異なるバンドのグレースケール画像の重み付けと処理により、カラー画像の生成と処理のための新しいカラー画像を得ることができます

B: プログラム

MATLAB 実装: 関連する関数は次のとおりです。詳細な説明については、MATLAB ヘルプ マニュアルを参照してください。

imadd(X,Y)関数: MATLAB で画像の追加を実行するために使用される関数です。

  • Aと はB追加する必要がある 2 つの画像で、グレースケール画像、RGB 画像、バイナリ画像のいずれかです。
  • さらに、imadd()この関数は、いくつかのオプションのパラメーターを追加することによって、画像追加操作の処理方法を制御することもできます。以下は、一般的に使用されるオプションのパラメーターの一部です。
    • scaling: 画像加算操作のスケーリング方法を制御するために使用されます。オプションの値はuint8uint16single、ですdoubleデフォルト値はuint8
    • outputtype: 出力画像のデータ型を指定するために使用され、オプションの値には入力画像の型と同じ型が含まれ、デフォルト値は入力画像の型と同じです
    • fillvalues: 加算結果が画像のグレースケール範囲を超える場合に、範囲外のピクセル値をどのように埋めるかを指定するために使用されます
      • bound: ハンドルを切り捨てる (デフォルト)
      • nearest: 最近傍差
      • samesize: 範囲外のピクセル値を入力画像の最大値に設定します
    • uint16: 出力画像のデータ型を 16 ビットの符号なし整数として指定するために使用されます。これは、ハイ ダイナミック レンジの画像を処理するために使用できます。

以下の効果を達成する

ここに画像の説明を挿入

Back = imread('desert.jpg');
Foreground = imread('car.jpg');

result1 = imadd(Foreground,-100);
result2 = imadd(Back, Foreground);
result3 = imadd(Back, result1);

subplot(221),imshow(Foreground),title('原目标图');
subplot(222),imshow(result1),title('原目标图加标量');
subplot(223),imshow(result2),title('原目标图加背景');
subplot(224),imshow(result3),title('加标量图叠加背景');

Python 実装: Python を使用して、上記と同じ機能を実現します。

cv2.add(src1, src2[, dst[, mask[, dtype]]])機能: この関数は、各ピクセルの値を加算し、結果を出力画像に格納します。加算の結果が出力イメージのデータ型で表現できる最大値より大きい場合、そのピクセルの値は切り捨てられ、最大値として格納されます。出力画像のデータ型が符号なし整数型の場合、0 未満のピクセル値はすべて 0 に切り捨てられます。出力画像のデータ型が符号付き整数型の場合、最大値より大きいピクセル値は最大値に切り捨てられます

  • src1: 最初の入力画像。
  • src2: 2 番目の入力画像。
  • dst: 入力画像と同じサイズとタイプの出力画像None
  • mask: オプションのマスク イメージ。入力イメージと同じサイズにするか、または にすることができますNone
  • dtype: 出力画像のデータ型。指定しない場合はデフォルトになりますsrc1.dtype
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

Back = cv2.imread('desert.jpg')
Foreground = cv2.imread('car.jpg')

result1 = cv2.add(Foreground, -100)
result2 = cv2.add(Back, Foreground)
result3 = cv2.add(Back, result1)

plt.subplot(221), plt.imshow(cv2.cvtColor(Foreground, cv2.COLOR_BGR2RGB)), plt.title('原目标图')
plt.subplot(222), plt.imshow(cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)), plt.title('原目标图加标量')
plt.subplot(223), plt.imshow(cv2.cvtColor(result2, cv2.COLOR_BGR2RGB)), plt.title('原目标图加背景')
plt.subplot(224), plt.imshow(cv2.cvtColor(result3, cv2.COLOR_BGR2RGB)), plt.title('加标量图叠加背景')
plt.show()

ここに画像の説明を挿入

(2) 減算演算

A: 概要

減算演算: 新しい画像を取得するために、同じサイズの 2 つの画像のピクセル レベルの加算演算を指します。2 つの画像の対応するピクセル値をf 1 ( x , y ) f_{1}(x,y)とする1( x ,y )f 2 ( x , y ) f_{2}(x,y)2( x ,y )の場合、それらの減算操作は次のように表すことができます。

g ( x , y ) = f 1 ( x , y ) − f 2 ( x , y ) g(x,y)=f_{1}(x,y) - f_{2}(x,y)g ( x ,=1( x ,2( x ,

画像加算演算を行う場合、主に以下のような合計値の処理方法があります

  • 切り捨て処理: 2 つの画像の対応するピクセルのグレー値を減算した後、差が特定のしきい値を超える場合は、しきい値まで切り捨てられます。それ以外の場合は、元の値が差の結果として保持されます。
  • 絶対値を取得する: 2 つの画像の対応するピクセルのグレー値を減算し、2 つの画像の差の結果として絶対値を取得します。この方法はシンプルで実装が容易ですが、画像の明るさやコントラストの影響を受けやすく、グレースケールの変化が大きい画像への影響は良くありません。
  • 2 乗差: 2 つの画像の対応するピクセルのグレー値を引き、2 乗してから、すべての差を合計し、2 つの画像の差の結果として平方根をとります。この方法は、グレースケールの変化が結果に与える影響を効果的に排除できますが、グレースケールの変化が大きい領域を拡大するため、差の精度に影響します。
  • 加重二乗差: 2 つの方法の欠点のバランスをとるために、加重二乗差法を使用できます。つまり、各ピクセルの差に重み係数を掛けてから、合計して平方根を計算します。一般的に使用される重み係数には、ガウス関数、一様分布関数などがあります。これにより、グレーレベルの変化が結果に与える影響を効果的に排除し、グレーレベルの変化が大きい領域を拡大する二乗差分法の欠点を回避できます。

ここに画像の説明を挿入

画像減算の主な用途は次のとおりです。

  • ターゲット検出: ターゲットを含む画像から背景画像を差し引いて、ターゲット領域のみの差分画像を取​​得します。これは、差分画像によるターゲットの検出と認識に使用できます。
  • 画像強調: 画像の低周波成分を高周波成分から分離し、元の画像から低周波成分を除去して得られた高周波画像を減算します。これにより、画像のエッジとディテールを強調できます。
  • 背景除去: ビデオ処理では、前のフレーム画像から現在のフレーム画像を減算することによって差分画像が取得されます。これは、背景除去および動体追跡に使用できます。
  • テクスチャ分析: テクスチャ分析では、回転やスケーリングなどの変換された画像から画像を差し引くことで、テクスチャの分類と分析のためにテクスチャ情報のみを含む画像を取得できます。
  • モルフォロジー処理: モルフォロジー処理では、画像を二値化した後、腐食や膨張などのモルフォロジー演算の結果画像から元の画像を差し引き、モルフォロジー処理された画像を取得します。

B: プログラム

MATLAB 実装: 関連する関数は次のとおりです。詳細な説明については、MATLAB ヘルプ マニュアルを参照してください。

imsubtract関数: 2 つの画像間のピクセル値の差を計算するために使用される MATLAB の関数です。1 つの画像のピクセル値と、2 つの画像の対応するピクセルの差を減算するために使用できます。

  • 入力パラメータI1と は、I2差を計算する必要がある 2 つの画像を表します。これらはグレースケールまたはカラー画像です。出力パラメータは、J入力画像と同じサイズとタイプを持つ、計算結果の画像です。
  • 出力結果を指定するために使用されるオプションのパラメーター'uint8'とデータ型。または型にすることができます。このパラメーターを省略した場合、関数はデフォルトで入力画像と同じデータ型を使用します。'intensity'uint8doubleimsubtract
J = imsubtract(I1, I2);
J = imsubtract(I1, I2, 'uint8');
J = imsubtract(I1, I2, 'intensity');

imabsdiff関数: 2 つの画像間のピクセル値の絶対差を計算するために MATLAB で使用される関数です。2 つの画像の対応するピクセル間の絶対差を計算するために使用できます。関数にはオプションのパラメーターがありません


以下の効果を達成する
ここに画像の説明を挿入

Back=imread('hallback.bmp');
Foreground=imread('hallforeground.bmp');
result = imabsdiff(Foreground,Back);
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Foreground),title('前景图');
subplot(133),imshow(result),title('图像相减');

Python 実装: Python を使用して、上記と同じ機能を実現します。

cv2.absdiff(src1, src2[, dst])関数: OpenCV で 2 つの画像の差分を計算するために使用される関数です。

  • src1: 最初の入力画像。単一チャネルまたは複数チャネルの画像で、データ型はnumpy配列です。
  • src2: 2 番目の入力画像は、src1サイズとデータ型が同じで、単一チャネルまたは複数チャネルの画像にすることができ、データ型はnumpy配列です。
  • dst: オプションのパラメーター。出力画像は入力画像と同じサイズとデータ型を持ち、データ型はnumpy配列です。指定しない場合、 および と同じサイズとデータ型の配列が出力src1として作成されますsrc2
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

# 读取背景和前景图像
Back = cv2.imread('hallback.bmp')
Foreground = cv2.imread('hallforeground.bmp')

# 计算前景图像和背景图像的像素绝对差值
result = cv2.absdiff(Foreground, Back)

# 使用matplotlib展示结果图像
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(Back, cv2.COLOR_BGR2RGB))
plt.title('背景')

plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(Foreground, cv2.COLOR_BGR2RGB))
plt.title('前景图')

plt.subplot(1, 3, 3)
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.title('图像相减')

plt.show()

ここに画像の説明を挿入

(3) 乗算演算

A: 概要

加算演算: ピクセルごとに実行されるバイナリ演算です。2 つの入力画像の対応するピクセルのピクセル値を乗算して、新しい出力画像を取得します。2 つの画像の対応するピクセル値をf 1 ( x , y ) f_{1}(x,y)とする1( x ,y )f 2 ( x , y ) f_{2}(x,y)2( x ,y )の場合、それらの乗算は次のように表すことができます。

g ( x , y ) = f 1 ( x , y ) × f 2 ( x , y ) g(x,y)=f_{1}(x,y) × f_{2}(x,y)g ( x ,=1( x ,×2( x ,

画像乗算の主な用途は次のとおりです。

  • 画像強調: 画像の乗算操作を使用して、画像のコントラストと明るさを強調できます。たとえば、画像に高輝度の一定の画像を乗算すると、画像の暗い領域をより明るくすることができます
  • 画像合成: 画像乗算操作を使用して、2 つの画像を 1 つの画像に結合できます。たとえば、画像にマスク画像を乗算することにより、マスク内の非ゼロ領域に対応するピクセルを元の画像から抽出して、新しい合成画像を生成できます。
  • ぼかし: ぼかしには画像乗算を使用できます。たとえば、画像にローパス フィルターの周波数応答を乗算すると、画像の高周波部分を除去してぼかし効果を得ることができます。
  • スペクトル分析: 画像乗算をスペクトル分析に使用できます。例えば、画像に周波数応答が単位円であるハイパス フィルターを掛けることで、画像の高周波部分の情報を抽出することができ、ハイパス フィルター効果が得られます。
  • ノイズ除去: 画像の乗算操作を使用して、画像からノイズを除去できます。たとえば、周波数応答が単位円であるローパス フィルターをイメージに乗算すると、イメージの高周波部分が除去され、ノイズが除去されます。

B: プログラム

MATLAB 実装: 関連する関数は次のとおりです。詳細な説明については、MATLAB ヘルプ マニュアルを参照してください。

immultiply(A,B,class)関数:

  • Aと はBそれぞれ 2 つの入力画像です。
  • class: 出力画像のデータ型を指定するために使用されます
    • uint8: 8 ビットの符号なし整数
    • uint16: 16 ビット符号なし整数
    • int16: 16 ビットの符号付き整数
    • single: 単精度浮動小数点型
    • double:倍精度浮動小数点型

以下の効果を達成する
ここに画像の説明を挿入

Back=im2double(imread('bird.jpg'));
Templet=im2double(imread('birdtemplet.bmp'));
result = immultiply(Templet,Back);
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Templet),title('模板');
subplot(133),imshow(result),title('图像相乘');

Python 実装: Python を使用して、上記と同じ機能を実現します。

csv2.multiply機能: 2 つの入力配列を要素単位で乗算し、結果を出力配列に書き込みます。乗算中に、要素の結果の値が出力配列データ型の表現可能な範囲外にある場合、結果は切り捨てられます。スケーリング パラメータが指定されている場合scale、結果はデー​​タ型の許容範囲内に収まるようにスケーリングされます。出力配列のデータ型が指定されていない場合、出力配列のデータ型は入力配列と同じになります

  • src1: 最初の配列は単一チャネルまたはマルチチャネル配列でなければならず、データ型は浮動小数点または整数です。
  • src2: 2 番目の配列は、最初の配列と同じ形状とデータ型である必要があります。
  • dst: 出力配列。形状とデータ型は入力配列と同じです。
  • scale: オプションのパラメーター。結果をスケーリングするためのスカラー値。デフォルトは 1 で、スケーリングなしを意味します。
  • dtype: オプションのパラメーター、出力配列のデータ型。指定しない場合、出力配列は入力配列と同じデータ型になります。
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

# 读取背景和模板图片
Back = cv2.imread('bird.jpg').astype(np.float32) / 255.0
Templet = cv2.imread('birdtemplet.bmp').astype(np.float32) / 255.0

# 计算图像相乘
result = cv2.multiply(Templet, Back)

# 展示结果
fig, ax = plt.subplots(1, 3, figsize=(12, 4))
ax[0].imshow(cv2.cvtColor(Back, cv2.COLOR_BGR2RGB))
ax[0].set_title('背景')
ax[1].imshow(cv2.cvtColor(Templet, cv2.COLOR_BGR2RGB))
ax[1].set_title('模板')
ax[2].imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
ax[2].set_title('图像相乘')
plt.show()

ここに画像の説明を挿入

(4) 部門運営

A: 概要

除算演算: ある画像の各ピクセル値を別の画像の対応するピクセル値で除算して、新しい画像を生成することを指します。次に、それらの除算操作は次のように表すことができます。

g ( x , y ) = f 1 ( x , y ) ÷ f 2 ( x , y ) g(x,y)=f_{1}(x,y) ÷ f_{2}(x,y)g ( x ,=1( x ,÷2( x ,

画像除算は、一部のアプリケーションでは加算、減算、および乗算よりも使用されませんが、特定の状況では役立ちます。一部の画像処理アプリケーションでは、画像分割を使用して、画像内の不均一な照明や色の歪みなどの問題を修正できます。たとえば、医療画像処理では、背景画像を使用してオブジェクトを含む画像を分割し、照明の変化やその他の気を散らすものを取り除くことができます。さらに、画像分割は、画像のコントラスト強調にも使用できます。コントラスト強調アプリケーションでは、画像分割を使用して、エッジやテクスチャなど、画像の高周波の詳細を強調できます。画像を平滑化されたバージョンで分割することにより、高周波情報が強化され、エッジとテクスチャがより明確になります

B: プログラム

MATLAB 実装: 関連する関数は次のとおりです。詳細な説明については、MATLAB ヘルプ マニュアルを参照してください。

imdivide(A,B,options)関数: MATLAB の画像処理関数です。

  • Aと はB2 つの入力画像行列です。Bピクセルの値が 0 の場合、出力イメージの対応するピクセルCの値はInf(無限大)になることに注意してください。また、入力行列に浮動小数点数が含まれる場合、出力行列も浮動小数点数になります。それ以外の場合、出力行列は入力行列と同じデータ型になります。
  • options構造体には次のフィールドが含まれます
    • RoundingMethod:値は'floor'(切り捨て、デフォルト値)、'ceil'(切り上げ)、'fix'(切り上げ部分)、'round'(丸め)、除算の丸め方法を指定できます。
    • NaNBehavior: 値は'omit'(NaN を省略、デフォルト値) または'replace'(NaN を 0 に置き換える) であり、BNaN が含まれる場合の処理​​方法を指定します。

Python 実装: Python を使用して、上記と同じ機能を実現します。なお、c2.divide丸め方法や NaN の扱い方法の指定には対応していません。これらの機能を実装する必要がある場合は、手動でコードを記述して実装する必要があります

cv2.divide(src1, src2, dst=None, scale=1)関数:

  • src1と はsrc22 つの入力画像
  • scalesrc2パラメータは、除算する倍率を表すスカラーです。デフォルト値は 1 です。

2: 画像論理演算

(1。概要

論理演算: デジタル画像処理では、論理演算とは、論理演算を使用して 2 つ以上の画像を結合する操作を指します。これらの演算は、イメージ内の各ピクセルの個々のビットに対して演算を行うため、ビット演算とも呼ばれます。デジタル画像処理で一般的に使用される論理演算には、次のものがあります。

  • AND 演算 (AND) : この演算では、2 つの入力画像の対応するピクセルが比較されます。両方のピクセルがゼロ以外 (値 1) の場合、出力ピクセルは 1 に設定されます。それ以外の場合、出力ピクセルは 0 に設定されます ( 0 が発生する限り、結果は 0 です)
  • オア演算 (OR) : この演算では、2 つの入力画像の対応するピクセルが比較されます。いずれかのピクセルの値が 1 の場合、出力ピクセルは 1 に設定されます。それ以外の場合、出力ピクセルは 0 に設定されます ( 1 がある限り、結果は 1 になります)
  • 排他的論理和演算 (XOR) : この演算では、2 つの入力画像の対応するピクセルが比較されます。ピクセルの値が異なる場合 (1 つのピクセルが 1 で、もう 1 つのピクセルが 0)、出力ピクセルは 1 に設定されます。それ以外の場合、出力ピクセルは 0 に設定されます ( 0 と任意の数の XOR は任意の数であり、それ自体との任意の数の XOR は 0 です)。
  • 否定演算 (NOT) : この演算では、入力画像のすべてのピクセルが反転されます。ピクセルの値が 1 の場合は 0 に設定され、その逆も同様です。

(2) プログラム

MATLAB 実装: 関連する関数は次のとおりです。詳細な説明については、MATLAB ヘルプ マニュアルを参照してください。

  • C = bitcmp(A): ビットごとの否定
  • C = bitand(A,B): ビットごとの AND
  • C = bitor(A,B): ビットごとの OR
  • C = bitxor(A,B): ビットごとの XOR

以下の効果を達成する

ここに画像の説明を挿入

Back=imread('bird.jpg');
Templet=imread('birdtemplet.bmp');
result1=bitcmp(Back);
result2=bitand(Templet,Back);
result3=bitor(Templet,Back);
result4=bitxor(Templet,Back);
figure;
subplot(121),imshow(Back),title('Back');
subplot(122),imshow(Templet),title('Templet');
figure;
subplot(221),imshow(result1),title('图像求反');
subplot(222),imshow(result2),title('图像相与');
subplot(223),imshow(result3),title('图像相或');
subplot(224),imshow(result4),title('图像异或');

Python 実装: Python を使用して、上記と同じ機能を実現します。

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

Back = cv2.imread('bird.jpg')
Templet = cv2.imread('birdtemplet.bmp')


result1 = cv2.bitwise_not(Back)
result2 = cv2.bitwise_and(Templet, Back)
result3 = cv2.bitwise_or(Templet, Back)
result4 = cv2.bitwise_xor(Templet, Back)


plt.subplot(221), plt.imshow(result1), plt.title('图像求反')
plt.subplot(222), plt.imshow(result2), plt.title('图像相与')
plt.subplot(223), plt.imshow(result3), plt.title('图像相或')
plt.subplot(224), plt.imshow(result4), plt.title('图像异或')
plt.show()

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_39183034/article/details/129908984