- 注12で問題を見つけるのは簡単です:畳み込み操作中にピクセルの周辺円を処理することはできません。
- 画像を畳み込む場合、境界ピクセルを畳み込むことはできません。これは、境界ピクセルがカーネルと完全に重なっていないためです。したがって、3x3フィルターを使用すると、1ピクセルのエッジは処理されず、2のエッジは処理されません。 5x5フィルターを使用した場合、ピクセルは処理されません。処理されます。
- エッジの処理
- 畳み込み演算の前に、エッジピクセルを追加し、ピクセル値を入力します
- BORDER_CONSTANT-指定されたピクセル値でエッジを塗りつぶします
- BORDER_REPLICATE-エッジピクセルを既知のエッジピクセル値で埋めます。
- BORDER_WRAP –反対側のピクセルを使用してパディングを補正します
- API
- copyMakeBorder(src、dst、top、bottom、left、right、borderType、value);
- パラメータ:元の画像、出力画像、エッジの長さ、通常、top \ bottom \ left \ rightは同じ値、エッジタイプ(つまり、上記の3つ)、色の値を取ります
- 畳み込み演算の前に、エッジピクセルを追加し、ピクセル値を入力します
- 実際、ぼかし中にGaussianBlurと一部の関数にborderTypeパラメーターがあることがわかります。
- GaussianBlur(src、dst、Size(3、3)、0、0、BORDER_CONSTANT);
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
using namespace std;
using namespace cv;
int main(int argc, char ** argv)
{
Mat src, gray, bin, dst;
src = imread("C:\\Users\\xujin\\Desktop\\test1.JPG");
if (!src.data)
{
cout << "no image";
return -1;
}
namedWindow("src_image", WINDOW_AUTOSIZE);
namedWindow("dst_image", WINDOW_AUTOSIZE);
imshow("src_image", src);
int top = (int)(0.05*src.rows);
int bottom = (int)(0.05*src.rows);
int left = (int)(0.05*src.cols);
int right = (int)(0.05*src.cols);
RNG rng = (12345);
int borderType = BORDER_CONSTANT;
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
copyMakeBorder(src, dst, top, bottom, left, right, borderType, color);
GaussianBlur(src, dst, Size(3, 3), 0, 0, BORDER_CONSTANT);
imshow("dst_image", dst);
waitKey(0);
return 0;
}