収縮と膨張浸食/拡張術
浸食/拡張は、白の言葉で、画像明るい部分の収縮と拡張を行うことです。
原則
- 我々は、コンボリューションカーネル行列を定義する。アンカーの位置を定義するが、このマトリックスは、任意の形状であってもよいが、典型的には、それは長方形または円形です。
- ピクセルは、アンカーの位置を変更する、原画像マトリックスを横切って畳み込み行列に1ずつ値。
- ピクセル値のアンカー位置は、(拡張/浸食に相当)、最大/最小値によってカバーされ、有効画素値畳み込みカーネル行列に変更されます。
「有効」ピクセル値とは何ですか?畳み込みカーネルは0ではありませんそれらの位置、すなわち、単語の式で表されます:
拡張および浸食、それが意味する最大最小処理要求「ローカルで表される畳み込みカーネルを」。
例を見てみましょう:
import cv2
import numpy as np
def test1():
img = np.zeros((10,10,1),np.uint8)
img[3:7,3:7,:] = 255
img[4:6,4:6,:] = 200
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
erosion_dst = cv2.erode(img, kernel1)
print(erosion_dst)
次のようにまず、10×10画素の画像を作成します。
[[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 255 255 255 255 0 0 0]
[ 0 0 0 255 200 200 255 0 0 0]
[ 0 0 0 255 200 200 255 0 0 0]
[ 0 0 0 255 255 255 255 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]]
私たちは、畳み込みカーネルを作成します。
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
getStructuringElement APIの
3つのパラメータは、アンカーの畳み込みカーネルの形状/サイズ/位置である。アンカ行列のデフォルトの中心位置。
3つの形状があります。
上記3×3の長方形の畳み込みカーネルコード、我々は次のように作成しました
腐食などのマトリックスと畳み込み後に元の画像と一致します
その行列は、以下の変更があります。
[[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 255 255 255 255 0 0 0]
[ 0 0 0 255 200 200 255 0 0 0]
[ 0 0 0 255 200 200 255 0 0 0]
[ 0 0 0 255 255 255 255 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]]
-->
[[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 200 200 0 0 0 0]
[ 0 0 0 0 200 200 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]]
我々は、すべての周辺画素の最小値をとる最小値は0であり、この画素場合、我々は、画素と一致するコンボリューションカーネル行列のアンカー位置:我々は[1,2,3]第4列のIMGの第三の行を考えます。画素値の画素値は、同じ方法で評価することができる残りの位置の位置0となります。
私たちは、異なるコンボリューションカーネルの役割の下で異なる結果がより明確に理解されるであろうものを見て、その後、少し私たちのコードを変更します
import cv2
import numpy as np
def test1():
img = np.zeros((10,10,1),np.uint8)
img[3:7,3:7,:] = 255
img[4:6,4:6,:] = 200
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
print(kernel1)
erosion_dst = cv2.erode(img, kernel1)
print(erosion_dst)
def test2():
img = np.zeros((10,10,1),np.uint8)
img[3:7,3:7,:] = 255
img[4:6,4:6,:] = 200
img[2,4,:] = 100
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
erosion_dst = cv2.erode(img, kernel1)
print(erosion_dst)
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
erosion_dst2 = cv2.erode(img, kernel2)
print(erosion_dst2)
test2()
私たちは、元の画像行列を変更しました
[[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 100 0 0 0 0 0]
[ 0 0 0 255 255 255 255 0 0 0]
[ 0 0 0 255 200 200 255 0 0 0]
[ 0 0 0 255 200 200 255 0 0 0]
[ 0 0 0 255 255 255 255 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]]
次のようにkernal1、kernal1を使用した場合:
第4行では、画素の第5行を、一例として、この時点で算出され、対応するアンカー畳み込みカーネルは、8つの画素の周囲の最小値と、最小値は0です。
私たちは、行列を取得します
我々はkernal2、kernal2を使用する場合、次のように
4行目では、画素の第5行は、アンカー畳み込みカーネルとそれに対応し、この時点で計算された最小値は、もはや8つの画素を包囲しないが、その正であります上記、すぐ下、左側にある右の4つの画素の最小値である。100の値
私たちが行列を取得します
OpenCVの例
from __future__ import print_function
import cv2 as cv
import numpy as np
import argparse
erosion_size = 0
max_elem = 2
max_kernel_size = 21
title_trackbar_element_type = 'Element:\n 0: Rect \n 1: Cross \n 2: Ellipse'
title_trackbar_kernel_size = 'Kernel size:\n 2n +1'
title_erosion_window = 'Erosion Demo'
title_dilatation_window = 'Dilation Demo'
def erosion(val):
erosion_size = cv.getTrackbarPos(title_trackbar_kernel_size, title_erosion_window)
erosion_type = 0
val_type = cv.getTrackbarPos(title_trackbar_element_type, title_erosion_window)
if val_type == 0:
erosion_type = cv.MORPH_RECT
elif val_type == 1:
erosion_type = cv.MORPH_CROSS
elif val_type == 2:
erosion_type = cv.MORPH_ELLIPSE
element = cv.getStructuringElement(erosion_type, (2*erosion_size + 1, 2*erosion_size+1), (erosion_size, erosion_size))
erosion_dst = cv.erode(src, element)
cv.imshow(title_erosion_window, erosion_dst)
def dilatation(val):
dilatation_size = cv.getTrackbarPos(title_trackbar_kernel_size, title_dilatation_window)
dilatation_type = 0
val_type = cv.getTrackbarPos(title_trackbar_element_type, title_dilatation_window)
if val_type == 0:
dilatation_type = cv.MORPH_RECT
elif val_type == 1:
dilatation_type = cv.MORPH_CROSS
elif val_type == 2:
dilatation_type = cv.MORPH_ELLIPSE
element = cv.getStructuringElement(dilatation_type, (2*dilatation_size + 1, 2*dilatation_size+1), (dilatation_size, dilatation_size))
dilatation_dst = cv.dilate(src, element)
cv.imshow(title_dilatation_window, dilatation_dst)
src = cv.imread("/home/sc/disk/keepgoing/opencv_test/j.png")
cv.namedWindow(title_erosion_window)
cv.createTrackbar(title_trackbar_element_type, title_erosion_window , 0, max_elem, erosion)
cv.createTrackbar(title_trackbar_kernel_size, title_erosion_window , 0, max_kernel_size, erosion)
cv.namedWindow(title_dilatation_window)
cv.createTrackbar(title_trackbar_element_type, title_dilatation_window , 0, max_elem, dilatation)
cv.createTrackbar(title_trackbar_kernel_size, title_dilatation_window , 0, max_kernel_size, dilatation)
erosion(0)
dilatation(0)
cv.waitKey()
createTrackbarウィンドウ上の2つのバーを作成、我々は、畳み込みカーネルの異なるサイズを容易にするために、異なる種類の影響を参照してください。
cv.createTrackbar(title_trackbar_element_type, title_erosion_window , 0, max_elem, erosion)
cv.createTrackbar(title_trackbar_kernel_size, title_erosion_window , 0, max_kernel_size, erosion)
オリジナルグラフィック:
治療効果: