0
我正在嘗試一些平滑過濾器。我不想使用OpenCV篩選器功能(是的,我知道它存在,但用於教學用途,我想創建我的)。如果你運行我的代碼,你會看到輸出Mat會被拉伸。我是OpenCV的新手,我無法理解發生了什麼。在我的代碼中,我將邊框添加到原始圖片,所以我可以應用3x3的過濾器,而不會出現stackoverflow問題。自己的平滑過濾器不起作用
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
/*
Smoothing Median
*/
using namespace cv;
using namespace std;
int main()
{
const int sizeFilter = 3;
const int border = 2;
Mat averageFilter(sizeFilter, sizeFilter, CV_8U, 1);
Mat input = imread("lena.jpg");
Mat sizedInput;
sizedInput = input.clone();
int sizeX = input.rows;
int sizeY = input.cols;
namedWindow("sizedInput");
imshow("sizedInput", sizedInput);
// Aggiungo i bordi per filtrare
copyMakeBorder(input, sizedInput, border, border,
border, border, BORDER_REPLICATE);
Mat dst = Mat(sizeX, sizeY, CV_8U);
for (int x = 2; x < sizeX; x++) {
for (int y = 2; y < sizeY; y++) {
int sum = 0;
sum = (int)sizedInput.at<uchar>(x - 1, y - 1)
+ (int)sizedInput.at<uchar>(x - 1, y)
+ (int)sizedInput.at<uchar>(x , y - 1)
+ (int)sizedInput.at<uchar>(x, y)
+ (int)sizedInput.at<uchar>(x, y + 1)
+ (int)sizedInput.at<uchar>(x + 1, y - 1)
+ (int)sizedInput.at<uchar>(x + 1, y + 1);
sum = sum * (0.11);
dst.at<uchar>(x , y) = sum;
}
}
namedWindow("Blu");
imshow("Blu", dst);
waitKey();
return 0;
}
是的,你是對的。非常感謝你!但是,我可以再問你一些嗎?什麼是真正的問題?我的意思是,當我加載沒有IMREAD_GRAYSCALE屬性的圖像時發生了什麼? – Vito
查看答案 – Miki
令人印象深刻!謝謝 – Vito