1 うねり
関数
画像内の極大値を見つけて、画像内のハイライト領域を拡大します。実行した結果は、元の画像のハイライト領域よりも大きくなります。
パラメータ
src: 输入矩阵
kernel: 卷积核
dts: 输出矩阵
anchor: 卷积核矩阵的锚点, 默认将卷积核矩阵的中心点作为锚点
iterations: 膨胀或腐蚀操作的迭代次数
borderType: 边界扩充的模式, 默认不扩充
borderValue: 当borderType=cv2.BORDER_CONSTANT时, 扩充边界的元素以borderValue填充
境界線の種類
BorderTypes.Default => パディングなし
BorderTypes.Constant=>指定されたピクセル値 (borderValue) で境界線を塗りつぶします。
BorderTypes.Replicate => エッジ ピクセルを既知のエッジ ピクセル値で塗りつぶす
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.]]
'''