OpenCV-Pythonは分水嶺アルゴリズムを使って画像の分割と抽出を実現します。
今の世界の発展に従って、コンピュータの視覚技術の応用はますます広くなりました。ハードウェアデバイスの継続的なアップグレードに伴い、複雑な構造のコンピュータビジュアルアプリケーションはますます容易になりました。OpenCV像はブラックボックスであり、基本画像処理の詳細については、視覚応用の開発に専念しましょう。
画像分割
分水嶺アルゴリズムを知る前に,画像の分割とは何かを知る必要がある。
画像の処理においては、常に画像から前景オブジェクトを対象画像として分割または抽出する必要がある。例えば、ビデオ監視カメラでは、固定背景下のビデオコンテンツが観測されていますが、背景自体には興味がありません。背景に現れる車、歩行者、または他のオブジェクトが興味があります。これらのオブジェクトをビデオから取り出して、背景にオブジェクトが入っていないビデオコンテンツを無視したいです。
スプリンクラーアルゴリズム
画像分割は画像処理において非常に重要な動作である。スプリットリッジアルゴリズムは画像を地理学上の地形表面にイメージして比喩し,画像分割を実現するために,このアルゴリズムは非常に有用である。
次に、ブロガーは分水嶺アルゴリズムに関する内容を簡単に紹介します。詳細はゴンザレスの『デジタル画像処理』を参照してください。
いずれの副階調画像も,地理的に地形面として見られ,階調値が高い領域ほど山として見られ,階調値が低い領域は谷として見られた。
もし私たちがそれぞれの谷に違う色の水を注ぎ込んだら。水位が上がるにつれて、谷によって水が集まってきます。この過程では、異なる谷の水が合流するのを防ぐために、水が合流する可能性のある場所に堤防を構築する必要があります。このプロセスは画像を二つの異なる集合に分けた。集水盆地と分水嶺線。私たちが構築した堤防は分水嶺線、すなわち原画像の分割です。これは分水嶺アルゴリズムの原理です。
しかし、一般的な画像には騒音があり、分水嶺アルゴリズムを採用すると、しばしば過剰分割の結果が得られます。画像分割の効果を改善するために,マスクに基づく改良したスプリットリッジアルゴリズムを提案した。改善されたスプリットリッジアルゴリズムは、ユーザーが同じ分割領域の一部として表示することを可能にする。このようにして、分水嶺アルゴリズムは処理する時、表示された部分を同じ分割領域に処理します。
この理論がよく分からない場合は、ソフトウェアPowerPointの「背景の削除」機能を使って観察して理解することができます。
water Shed関数
OpenCVでは関数cv 2.watershed()関数を用いてスプリットリッジアルゴリズムを実現できます。しかし、具体的に実現するプロセスは、形態学関数、距離変換関数cv 2.distance Transform()、cv 2.connectedComponents()によって画像分割を行う必要があります。
形態学的分割
スプリットリッジアルゴリズムを使用する前に,画像に対して簡単な形態学的処理を行う必要がある。一般的には形態学における演算を使用していますが、演算は腐食後の膨張操作であり、画像内のノイズを除去することができます。
distance Transform関数
画像内の各サブ図が接続されていない場合は、そのまま形態学的な腐食動作を用いて前景オブジェクトを特定することができるが、画像内のサブ図が接続されていると前景オブジェクトの特定が難しくなる。このときは、変換関数cv 2.distance Transform()によって、前景オブジェクトを簡単に抽出する必要があります。
cv 2.distance Transform()は、各ピクセルポイントと背景(値が0のピクセルポイント)の距離関係を反映しています。通常の場合:前景オブジェクトの中心距離値が0の画素点距離が遠いと大きな値が得られる。 前景オブジェクトのエッジ距離値が0の画素点が近い場合、より小さい値が得られる。 次に,この関数を用いて副画像の見通しを決定し,効果を観察した。
未知の領域を決定
距離関数により,画像の「中心」,すなわち「前景の決定」を得た。後続の説明を便利にするために、将来性を確認することをFといいます。
画像には前景を確定するFと背景Bがあります。残りの領域は未知の領域UNです。この部分の領域は分水嶺アルゴリズムによってさらに明確な領域である。
1つの画像0に対しては、未知の領域UNが以下の関係で得られる。
未知の領域UN=画像0-背景を決定するB-前景を決定するF
上記の式から変換されます。
未知の領域UN=(画像0-背景を決定するB)-前景を決定するF
その中(画像0−背景Bを決定する)は、私たちが始めた減算動作であり、形態学的膨張によって得られます。上のコードを4行追加して表示されたコードの内容を変更するだけです。
左上が原図である
右上は原図膨張後の画像bgであり、背景画像は確定背景Bである。前景画像は「オリジナル画像0-背景Bの決定」です。
左下は前景画像を確定するためのforeです。
右下は未知の領域画像UNです。
Conneced Components関数
前景を確定したら、確定前景を表示することができます。OpenCVではcv 2.Connectd Components()関数を提供しています。
この関数は、背景を0として表示し、他のオブジェクトを1から正の整数で表示します。これは一つのパラメータ8ビットのシングルチャネルの表示対象画像だけです。
戻り値は2つあります。リターンの表示数として、labelsは表示の結果画像です。
以下、この関数を使って表記します。コードは以下の通りです。
実戦分水嶺アルゴリズム
前文の紹介を経て、分水嶺アルゴリズムを用いた画像分割の基本的なステップを理解した。元の画像0は、エコロジー演算によってノイズ除去される 。は、腐食動作により「背景Bを決定する」ことを取得する。なお、ここでは「元の画像-背景の決定」を得ることができます。 は、距離変換関数を用いて元の画像を演算し、閾値処理を行い、「前景を決定するF」 を得る。は、未知の領域UN(UN=0-B-F) を計算する。は、関数cv 2.connected Components()を利用して元の画像0を表示する 関数cv 2.connectedComponents()の表示結果を補正します。 分水嶺関数を用いて画像の分割を完了する。
完全コードは以下の通りです。
もちろん、パラメータは調整できます。大体の硬貨が完全に分割されているのが見えます。
ここで、OpenCV-Pythonについては分水嶺アルゴリズムを使って画像の分割と抽出を実現した文章を紹介します。OpenCVの画像分割と抽出に関する詳細については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。
画像分割
分水嶺アルゴリズムを知る前に,画像の分割とは何かを知る必要がある。
画像の処理においては、常に画像から前景オブジェクトを対象画像として分割または抽出する必要がある。例えば、ビデオ監視カメラでは、固定背景下のビデオコンテンツが観測されていますが、背景自体には興味がありません。背景に現れる車、歩行者、または他のオブジェクトが興味があります。これらのオブジェクトをビデオから取り出して、背景にオブジェクトが入っていないビデオコンテンツを無視したいです。
スプリンクラーアルゴリズム
画像分割は画像処理において非常に重要な動作である。スプリットリッジアルゴリズムは画像を地理学上の地形表面にイメージして比喩し,画像分割を実現するために,このアルゴリズムは非常に有用である。
次に、ブロガーは分水嶺アルゴリズムに関する内容を簡単に紹介します。詳細はゴンザレスの『デジタル画像処理』を参照してください。
いずれの副階調画像も,地理的に地形面として見られ,階調値が高い領域ほど山として見られ,階調値が低い領域は谷として見られた。
もし私たちがそれぞれの谷に違う色の水を注ぎ込んだら。水位が上がるにつれて、谷によって水が集まってきます。この過程では、異なる谷の水が合流するのを防ぐために、水が合流する可能性のある場所に堤防を構築する必要があります。このプロセスは画像を二つの異なる集合に分けた。集水盆地と分水嶺線。私たちが構築した堤防は分水嶺線、すなわち原画像の分割です。これは分水嶺アルゴリズムの原理です。
しかし、一般的な画像には騒音があり、分水嶺アルゴリズムを採用すると、しばしば過剰分割の結果が得られます。画像分割の効果を改善するために,マスクに基づく改良したスプリットリッジアルゴリズムを提案した。改善されたスプリットリッジアルゴリズムは、ユーザーが同じ分割領域の一部として表示することを可能にする。このようにして、分水嶺アルゴリズムは処理する時、表示された部分を同じ分割領域に処理します。
この理論がよく分からない場合は、ソフトウェアPowerPointの「背景の削除」機能を使って観察して理解することができます。
water Shed関数
OpenCVでは関数cv 2.watershed()関数を用いてスプリットリッジアルゴリズムを実現できます。しかし、具体的に実現するプロセスは、形態学関数、距離変換関数cv 2.distance Transform()、cv 2.connectedComponents()によって画像分割を行う必要があります。
形態学的分割
スプリットリッジアルゴリズムを使用する前に,画像に対して簡単な形態学的処理を行う必要がある。一般的には形態学における演算を使用していますが、演算は腐食後の膨張操作であり、画像内のノイズを除去することができます。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("36.jpg")
k=np.ones((5,5),dtype=np.uint8)
e=cv2.erode(img,k)
result=cv2.subtract(img,e)
plt.subplot(131)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(132)
plt.imshow(e, cmap="gray")
plt.axis('off')
plt.subplot(133)
plt.imshow(result, cmap="gray")
plt.axis('off')
plt.show()
振り返ってみますと、私たちの前の演算関数はcv.2.erodeです。ここではまず演算を通してノイズを除去します。その後、減算演算cv 2.subtract()は画像境界を取得する。運転後の効果は以下の通りです。distance Transform関数
画像内の各サブ図が接続されていない場合は、そのまま形態学的な腐食動作を用いて前景オブジェクトを特定することができるが、画像内のサブ図が接続されていると前景オブジェクトの特定が難しくなる。このときは、変換関数cv 2.distance Transform()によって、前景オブジェクトを簡単に抽出する必要があります。
cv 2.distance Transform()は、各ピクセルポイントと背景(値が0のピクセルポイント)の距離関係を反映しています。通常の場合:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("36.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
k = np.ones((5, 5), dtype=np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, k, iterations=2)
distTransform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, fore = cv2.threshold(distTransform, 0.7 * distTransform.max(), 255, 0)
plt.subplot(131)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(132)
plt.imshow(distTransform, cmap="gray")
plt.axis('off')
plt.subplot(133)
plt.imshow(fore, cmap="gray")
plt.axis('off')
plt.show()
ここで、cv 2.morphologyEx関数を使って演算を行いながら、cv 2.distance Transformを使って距離画像を得て、最後にcv 2.thress holdを通して距離画像を閾値処理し、前景を確定します。運転後の効果は以下の通りです。未知の領域を決定
距離関数により,画像の「中心」,すなわち「前景の決定」を得た。後続の説明を便利にするために、将来性を確認することをFといいます。
画像には前景を確定するFと背景Bがあります。残りの領域は未知の領域UNです。この部分の領域は分水嶺アルゴリズムによってさらに明確な領域である。
1つの画像0に対しては、未知の領域UNが以下の関係で得られる。
未知の領域UN=画像0-背景を決定するB-前景を決定するF
上記の式から変換されます。
未知の領域UN=(画像0-背景を決定するB)-前景を決定するF
その中(画像0−背景Bを決定する)は、私たちが始めた減算動作であり、形態学的膨張によって得られます。上のコードを4行追加して表示されたコードの内容を変更するだけです。
bg=cv2.dilate(opening,k,iterations=3)
fore=np.uint8(fore)
un=cv2.subtract(bg,fore)
plt.subplot(221)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(222)
plt.imshow(bg, cmap="gray")
plt.axis('off')
plt.subplot(223)
plt.imshow(fore, cmap="gray")
plt.axis('off')
plt.subplot(224)
plt.imshow(un, cmap="gray")
plt.axis('off')
plt.show()
運転後の効果は以下の通りです。左上が原図である
右上は原図膨張後の画像bgであり、背景画像は確定背景Bである。前景画像は「オリジナル画像0-背景Bの決定」です。
左下は前景画像を確定するためのforeです。
右下は未知の領域画像UNです。
Conneced Components関数
前景を確定したら、確定前景を表示することができます。OpenCVではcv 2.Connectd Components()関数を提供しています。
この関数は、背景を0として表示し、他のオブジェクトを1から正の整数で表示します。これは一つのパラメータ8ビットのシングルチャネルの表示対象画像だけです。
戻り値は2つあります。リターンの表示数として、labelsは表示の結果画像です。
以下、この関数を使って表記します。コードは以下の通りです。
bg = cv2.dilate(opening, k, iterations=3)
fore = np.uint8(fore)
ret, markets = cv2.connectedComponents(fore)
unknown=cv2.subtract(bg,fore)
markets=markets+1
markets[unknown==255]=0
plt.subplot(131)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(132)
plt.imshow(fore, cmap="gray")
plt.axis('off')
plt.subplot(133)
plt.imshow(markets, cmap="gray")
plt.axis('off')
plt.show()
上のフォーム=np.uint 8(fore)のコードを修正し、出力内容を修正します。運転後、原図、前景画像の中心点画像fore、および表示後の結果画像marketsを取得します。効果は以下の通りです実戦分水嶺アルゴリズム
前文の紹介を経て、分水嶺アルゴリズムを用いた画像分割の基本的なステップを理解した。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("36.jpg")
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis('off')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
k = np.ones((5, 5), dtype=np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, k, iterations=2)
distTransform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, fore = cv2.threshold(distTransform, 0.2 * distTransform.max(), 255, 0)
bg = cv2.dilate(opening, k, iterations=3)
fore = np.uint8(fore)
ret, markets = cv2.connectedComponents(fore)
unknown = cv2.subtract(bg, fore)
markets = markets + 1
markets[unknown == 255] = 0
markets = cv2.watershed(img, markets)
img[markets == -1] = [255, 0, 0]
plt.subplot(122)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.show()
運転後、分割された画像を得ることができます。もちろん、パラメータは調整できます。大体の硬貨が完全に分割されているのが見えます。
ここで、OpenCV-Pythonについては分水嶺アルゴリズムを使って画像の分割と抽出を実現した文章を紹介します。OpenCVの画像分割と抽出に関する詳細については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。