OpenCV-Python画像減算操作cv2.subtract関数の詳細な説明と行列減算との比較

☞░GoLaoYuanPythonはhttps://blog.csdn.net/LaoYuanPythonブログ

I.概要

OpenCV-Python画像追加操作cv2.add関数詳細説明」では、画像追加操作の詳細を紹介します。追加がある場合は減算します。この記事では画像減算操作を紹介します。

通常、画像減算は画像の違いを見つけるために使用されます。たとえば、医療用血管画像と造影後の血管画像を比較することで血流を確認できます。もちろん、特殊な画像処理にも使用できます。

2、cv2.subtract関数の構文

呼び出し構文:

subtract(src1, src2, dst=None, mask=None, dtype=None)

パラメータの説明:

減算のパラメータは、加算のパラメータと似ています。

  1. src1:減算された画像配列またはスカラー
  2. src2:減算としての画像配列またはスカラー
  3. dst:オプションのパラメーター、出力結果を保存するための変数、デフォルト値はNone、Noneでない場合、出力画像はdstの対応する実際のパラメーターに保存され、そのサイズとチャネル番号は入力画像と同じです。画像の深さ(つまり、画像ピクセル) Digits)は、dtypeパラメーターまたは入力イメージによって決定されます
  4. マスク:イメージマスク、オプションパラメータ、8ビットシングルチャネルグレースケールイメージ。変更する出力イメージアレイの要素を指定するために使用されます。つまり、出力イメージピクセルは、マスクの対応する位置要素が0でない場合にのみ出力されます。それ以外の場合。この位置のピクセルのすべてのチャネルコンポーネントは0に設定されます
  5. dtype:オプションのパラメーター、出力画像配列の深さ、つまり、画像の単一ピクセル値のビット数(RGBが3バイトで表される場合、24ビット)。
  6. 戻り値:減算の結果画像

減算操作の3、4シーン

  1. 2つの画像マトリックスを減算するには、2つのマトリックスのサイズとチャネル数が同じである必要があります
    dst(I)=saturate(src1(I)−src2(I))if mask(I)≠0
  2. 1つの画像マトリックスと1つのスカラーを減算します。src2はスカラーであるか、src1のチャネル数と同じ要素数である必要があります。実際のテスト後は4倍になります。src1が3チャネルの場合、次のように比較されます。 4つの要素の最初の3つの要素を減算します
    dst(I)=saturate(src1(I)−src2)if mask(I)≠0
  3. 画像配列から1つのスカラーを減算します。これには、src1がスカラーであるか、src1のチャネル数と同じ数の要素である必要があります。
    dst(I)=saturate(src1−src2(I))if mask(I)≠0
  4. 与えられた値からマトリックスを減算するSubRSの場合、それはスカラーと画像配列の減算の逆差です。古い猿はこれが2番目のシーンの特別な解釈であると考えています
    dst(I)=saturate(src2−src1(I))if mask(I)≠0

上記の計算プロセスに疑問がある場合は、「opencv画像処理学習エッセイ:ヘルプドキュメントの計算式における飽和の意味」を参照してください

4、減算操作の場合

次の2つの図では、後者は前者に基づいており、2つの追加テキストと1つの曲線があります。

元の画像seaside.jpg:

ここに写真の説明を挿入

変更された新しい画像seaside_new.jpgを元の画像に追加します。ここに写真の説明を挿入

減算ケースコード:

import numpy as np
import cv2

def  main():
    img1 = cv2.imread(r'F:\pic\seaside.jpg')
    img2 = cv2.imread(r'F:\pic\seaside_new.jpg')
  
    diffImg1 = cv2.subtract(img1,img2)
    diffImg2 = cv2.subtract(img2, img1)
    diffImg3 = img1 - img2
    diffImg4 =  img2 - img1

    cv2.imshow('subtract(img1,img2)',diffImg1)
    cv2.imshow('subtract(img2,img1)', diffImg2)
    cv2.imshow('img1 - img2',diffImg3)
    cv2.imshow('img2 - img1', diffImg4)

    cv2.waitKey(0)

main()

Subtract(img2、img1)結果グラフ:

ここに写真の説明を挿入

Subtract(img1、img2)結果グラフ:

ここに写真の説明を挿入

img1-img2結果グラフ:

ここに写真の説明を挿入

img2-img1結果グラフ:

ここに写真の説明を挿入

差異を処理する場合、opencvの減算と行列の減算がより自然でスムーズであることがわかります。この状況は、2つの画像が表面上は似ているように見えても、実際には比較的大きな違いがある場合に、より明白になります。

上記の場合、最初の画像はウィンドウを使用して描画および保存した後に保存され、2番目の画像は前に保存された画像に基づいてコンテンツが追加されました。最初の画像を保存せずに元の画像として直接使用する場合、コンテンツと保存された名前大きな違いがあり、2つのファイルのサイズが異なります。次のseaside2.jpgは、描画ツールを使用せずに保存された実際の元の画像であり、seaside.jpgは、描画ツールを使用して保存された元の画像です。2つの画像の解像度は同じです。

ここに写真の説明を挿入
実際の元の画像を使用して、変換されたコンテンツ画像と比較します。コードは次のように表示されます。

def  main():
    img1 = cv2.imread(r'F:\pic\seaside2.jpg')
    img2 = cv2.imread(r'F:\pic\seaside_new.jpg')
  
    print(img1.shape,img2.shape)
    diffImg1 = cv2.subtract(img1,img2)
    diffImg2 = cv2.subtract(img2, img1)
    diffImg3 = img1 - img2
    diffImg4 =  img2 - img1

    cv2.imshow('subtract(img1,img2)',diffImg1)
    cv2.imshow('subtract(img2,img1)', diffImg2)
    cv2.imshow('img1 - img2', diffImg3)
    cv2.imshow('img2 - img1',diffImg4)

    cv2.waitKey(0)

main()

各処理結果のイメージは次のとおりです。

減算(img1、img2):

ここに写真の説明を挿入

減算(img2、img1):ここに写真の説明を挿入
img2 img1:

ここに写真の説明を挿入

img1 img2:

ここに写真の説明を挿入
この種の画像処理では、OpenCV処理がマトリックス減算よりもはるかに優れていることがわかります。

関連データを注意深く分析した後、BGRの3つのコンポーネントの小さな変更として保存した後の画像のピクセルデータのほとんどは、チャネルごとに1〜2の値の違いである可能性があり、一部のチャネルは少し増加していることがわかりました。 Opencvは飽和演算です。0未満の場合は0に設定されますが、行列演算の場合はuint8であるため、負の数値は256に負の数値の値を加えたものになり、大きな違いが生じます。

V.まとめ

この記事では、opencv画像減算の機能、特定の構文、および4つの使用シナリオを詳細に紹介し、opencv画像減算と行列減算の違いの例を示します。OpenCVの減算関数は、画像処理における行列減算よりも自然でスムーズであることがわかります。 。

OpenCV-Pythonの詳細については、「OpenCV-Pythonグラフィックスと画像処理」の列を参照してください。

ブログアドレスhttps//blog.csdn.net/laoyuanpython/category_9979286.html

古い猿についての有料コラム

Lao Yuanの有料コラム「PyQtを使用したグラフィカルインターフェースPythonアプリケーションの開発」(https://blog.csdn.net/laoyuanpython/category_9607725.html)では、PythonベースのPyQtグラフィカルインターフェース開発の基本的なチュートリアルと、有料コラム「映画のようなオーディオとビデオの開発」を具体的に紹介しています。コラム」(https://blog.csdn.net/laoyuanpython/category_10232926.html)では、映画のようなオーディオとビデオの編集と合成の関連する方法と、関連する編集と合成のシーンを処理するための関連する方法の使用について詳しく紹介しています。どちらのコラムも特定のシーンに適しています。基本的なPythonを持っているが、関連する知識がない初心者の読者は学びます。

有料コラム記事ディレクトリ:「moviepyオーディオおよびビデオ開発コラム記事ディレクトリ」(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、「PyQtを使用してグラフィカルインターフェイスPythonアプリケーションコラムディレクトリを開発する」(https:// blog.csdn.net/LaoYuanPython/article/details/107580932)。

Pythonの基礎が不足している場合は、Lao Yuanの無料のコラム「Column:Python Basic Tutorial Directory」(https://blog.csdn.net/laoyuanpython/category_9831699.html)からPythonを最初から学ぶことができます

Old Apeの読者に興味があり、喜んでサポートする場合は、有料のコラムを購入することを歓迎します。

古い猿からPythonとOpenCVを学びましょう!

☞░LaoYuanPythonブログ投稿ディレクトリhttps://blog.csdn.net/LaoYuanPython░に移動します

おすすめ

転載: blog.csdn.net/LaoYuanPython/article/details/109020778