私はmorphを使用しています。 OpenCVで開き、opencv経由で画像のROI外のノイズを減らしています。今まで、ノイズリダクションが必要なときはいつでも、カーネルサイズを無作為に増やしたり、繰り返し回数を増やしたりすることができます。しかし、あなたがどの状況をどのように変えるかをどのように増やす/決めるのかによって、結果には大きな違いがありますか?私は推測とは別のパラメータを変更する(より多くの方法で)より良いアプローチを考え出しています。モルフォロジー演算(OpenCV)における反復とカーネルサイズ
答えて
カーネルの種類によって異なります。奇数平方カーネルを使って膨張または腐食するには、サイズを大きくするか反復を増やすかに違いはありません(等しいとする値を使用すると仮定して)。例:
>>> M = np.zeros((7,7), dtype=np.uint8)
>>> M[3,3] = 1
>>> k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
>>> M1 = cv2.dilate(M, k1, iterations=2)
>>> k2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
>>> M2 = cv2.dilate(M, k2, iterations=1)
>>> M1
[[0 0 0 0 0 0 0]
[0 1 1 1 1 1 0]
[0 1 1 1 1 1 0]
[0 1 1 1 1 1 0]
[0 1 1 1 1 1 0]
[0 1 1 1 1 1 0]
[0 0 0 0 0 0 0]]
>>> M2
[[0 0 0 0 0 0 0]
[0 1 1 1 1 1 0]
[0 1 1 1 1 1 0]
[0 1 1 1 1 1 0]
[0 1 1 1 1 1 0]
[0 1 1 1 1 1 0]
[0 0 0 0 0 0 0]]
これはかなり直感的です。拡張するための長方形のカーネルは、任意の白色画素を見つけ、隣接する画素を白色に変える。したがって、これを2回行うと、1つの白いピクセルが5×5ブロックの白いピクセルに変わることは容易にわかります。ここでは、中央のピクセルが比較されるピクセルであると仮定しています--- アンカー ---これは変更される可能性があり、結果に影響する可能性があります。あなたはそれが形(直感的)を作成しながら、彼らは同じ場所にいないしていることを見ることができます
>>> M = np.zeros((5, 5), dtype=np.uint8)
>>> M[2,2] = 1
>>> k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
>>> M1 = cv2.dilate(M, k1, iterations=2)
>>> k2 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
>>> M2 = cv2.dilate(M, k2, iterations=1)
>>> M1
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 1 1 1]
[0 0 1 1 1]
[0 0 1 1 1]]
>>> M2
[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]
:たとえば、あなたが(3, 3)
カーネルの1回の繰り返しと(2, 2)
カーネルの2回の反復を比較したと仮定(非直感的)。カーネルの中央には(2, 2)
カーネルのアンカーがありません---この場合、中心にあるピクセルでは、拡大する隣人は右下にしかないことがわかります。これは、方向を選択する必要があるためです1つのピクセルを拡張して(2, 2)
の正方形を埋めることしかできないためです。
非長方形カーネルの場合は、さらに複雑になります。たとえば、
>>> M = np.zeros((5, 5), dtype=np.uint8)
>>> M[2,2] = 1
>>> k1 = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
>>> M1 = cv2.dilate(M, k1, iterations=2)
>>> k2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
>>> M2 = cv2.dilate(M, k2, iterations=1)
>>> M1
[[0 0 1 0 0]
[0 1 1 1 0]
[1 1 1 1 1]
[0 1 1 1 0]
[0 0 1 0 0]]
>>> M2
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
M1の最初のパスは、高さ3ピクセル、幅3ピクセルの小さな十字形を作成します。しかし、それらのピクセルのそれぞれは、実際にはダイヤモンドパターンを作成する、その場所に十字を作成します。
したがって、奇数次元の矩形カーネルでは、基本的なモルフォロジー演算を集計すると同じ結果になりますが、他のカーネルでは結果が異なります。他の形態操作をこのような簡単な例に適用すると、それらがどのように動作し、どの操作を使用するべきか、そしてその効果を増やす方法がわかります。
- 1. システムの反復演算子
- 2. リスト反復のFreeMarker算術演算
- 3. モルフォロジー演算は画像のエッジとラインをマージする
- 4. sed反復演算子オペランドが無効*****
- 5. 増分Javaのstringtemplateにおける反復における値
- 6. バイナリイメージを見つけるMATLABのモルフォロジー演算子を使った交点
- 7. OpenCV反復ランダムフォレストトレーニング
- 8. ループとメモリ管理におけるC++ポインタ算術演算?
- 9. 配列操作におけるビット演算と通常演算の混同(java)
- 10. Alef反復演算子とは何ですか?
- 11. プログラムのクラッシュとコーディングにおける算術演算に関する質問
- 12. フォースパイソン画像におけるカラーバー反復ごと
- 13. OpenCVのC++マット==演算子
- 14. 反復処理によるメモリリークOpencvフレーム
- 15. バイナリ%演算子の反復数を取得する
- 16. 反復減算?
- 17. 逆反復算術
- 18. テンプレートメタプログラミングにおける三項演算子の置換
- 19. モルガンの法則実装におけるHaskellドット(。)演算子
- 20. 抽象クラスにおけるインクリメンタル演算子のオーバーロードC++
- 21. 出力ストリームにおけるC++演算子の優先順位
- 22. 反復(3.2.2)WSO2 ESBにおける応答(4.8.1)は
- 23. 遺伝的アルゴリズムにおけるトーナメントセレクションの複数反復
- 24. 強化学習における値の反復の基本ケース
- 25. OpenCV - ベクトルを反復処理するときに "無効なパラメータ"
- 26. Flinkの一括反復演算子とwhileループの違いは何ですか?
- 27. 演算子#+および# - .sbclrc
- 28. オーバーロード+ =、+、==、および=演算子
- 29. 反復除算と征服アルゴリズム
- 30. and&or演算子を使用したポストインクリメント演算子の作業におけるdiffrence