opencv の拡張と腐食

1 うねり

関数

画像内の極大値を見つけて、画像内のハイライト領域を拡大します。実行した結果は、元の画像のハイライト領域よりも大きくなります。

パラメータ

src: 输入矩阵
kernel: 卷积核
dts: 输出矩阵
anchor: 卷积核矩阵的锚点, 默认将卷积核矩阵的中心点作为锚点
iterations: 膨胀或腐蚀操作的迭代次数
borderType: 边界扩充的模式, 默认不扩充
borderValue: 当borderType=cv2.BORDER_CONSTANT时, 扩充边界的元素以borderValue填充

境界線の種類

  1. BorderTypes.Default => パディングなし

  1. BorderTypes.Constant=>指定されたピクセル値 (borderValue) で境界線を塗りつぶします。

  1. BorderTypes.Replicate => エッジ ピクセルを既知のエッジ ピクセル値で塗りつぶす

  1. BorderTypes.Wrap => 反対側のピクセルを使用してパディングを補正します

計算プロセス

コンボリューション処理と同様に、要素がすべて 1 であるコンボリューション カーネル行列を設定します。コンボリューション計算後のピクセルの値は、そのピクセルを中心とするコンボリューション カーネル行列の範囲内の最大値に等しくなります。下図のケース 1 に示すように、赤枠は 3*3 のコンボリューション カーネルであり、拡張操作はコンボリューション カーネル領域の最大値をコンボリューション カーネルの中心点に代入することです (1 を 8 に置き換えます)。

case1 (デフォルトではパディングなし)

case2 (定数を入力)

Pythonコード

from cv2 import BORDER_CONSTANT, MORPH_RECT
import numpy as np
import cv2


x = np.array([
             [1,   2,  3,  4],
             [8,   7,  6,  5],
             [9,  10, 11, 12],
             [16, 15, 14, 13]
             ], 
             dtype=np.float64())

kernel = cv2.getStructuringElement(MORPH_RECT, (3,3))

# case1
y1 = cv2.dilate(x, kernel, iterations=1)
print(y1)
# 打印结果
'''
[[ 8.  8.  7.  6.]
 [10. 11. 12. 12.]
 [16. 16. 15. 14.]
 [16. 16. 15. 14.]]
'''

# 把borderType设置为BorderTypes.Constant, borderValue设为100
# case2
y2 = cv2.dilate(x, kernel, iterations=1, borderType=BORDER_CONSTANT, borderValue=100)
print(y2)
# 打印结果
'''
[[100. 100. 100. 100.]
 [100.  11.  12. 100.]
 [100.  16.  15. 100.]
 [100. 100. 100. 100.]]
'''

C++コード

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;


int main()
{
    Mat src = imread("D:\\c++_opencv\\images\\0--Parade_0_Parade_marchingband_1_20.jpg", IMREAD_ANYCOLOR);
    imshow("input", src);

    Mat dst;

    Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3));

    dilate(src, dst, kernel);

    imshow("output", dst);
    waitKey(0);

    destroyAllWindows();

    return 0;
}

2 腐食

関数

画像内の極小値を見つけて、画像内のハイライト領域を縮小します。実行の結果は、元の画像のハイライト領域よりも小さくなります。

計算プロセス

コンボリューション処理と同様に、要素がすべて 1 であるコンボリューション カーネル行列を設定します。コンボリューション計算後のピクセルの値は、そのピクセルを中心とするコンボリューション カーネル行列の範囲内の最小値に等しくなります。下図に示すように、赤枠は 3*3 のコンボリューション カーネルであり、拡張操作はコンボリューション カーネル領域の最小値をコンボリューション カーネルの中心点に代入することです (11 が 13 に置き換わります)。

Pythonコード

from cv2 import BORDER_CONSTANT, MORPH_RECT
import numpy as np
import cv2


x = np.array([
             [1,   2,  3,  4],
             [8,   7,  6,  5],
             [9,  10, 11, 12],
             [16, 15, 14, 13]
             ], 
             dtype=np.float64())

kernel = cv2.getStructuringElement(MORPH_RECT, (3,3))

y1 = cv2.erode(x, kernel, iterations=1)
print(y1)

# 打印结果
'''
[[ 1.  1.  2.  3.]
 [ 1.  1.  2.  3.]
 [ 7.  6.  5.  5.]
 [ 9.  9. 10. 11.]]
'''

おすすめ

転載: blog.csdn.net/qq_38964360/article/details/129174483