herrDeng網內搜尋

自訂搜尋

Ads

2023年11月29日 星期三

opencv C++使用卷積convolution/correlation進行影像處理

 
 opencv C++使用卷積convolution/correlation進行影像處理 

影片中有實做找邊緣(Laplacian Operator)、銳利化。

 cross-correlation與卷積定義不同,但由於所用之Kermel Matrix均x,y軸對稱,所以是相同的。
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

void kernel(Mat src, Mat& im, Mat k, string desc, bool neg=0) {
	filter2D(src, im, src.depth(), k);
	if (neg) im = ~im;
	imshow(desc, im);
}
int main()
{
	try
	{
		cout << "做影像處理使用 covolution/cross-corelation\n";

		Mat src = imread("2dogs.jpg");
		resize(src, src, src.size());
		imshow("image", src);
		const double inv_sqrt2 = 0.70710678118654752440084436210485;
		Mat im, im0, im1;
		Mat kk0 = (Mat_<double>(3, 3) << 0, 1, 0, 1, -4, 1, 0, 1, 0);
		Mat kk1 = (Mat_<double>(3, 3) << 1, 1, 1, 1, -8, 1, 1, 1, 1);
		Mat kk2 = (Mat_<double>(3, 3) << inv_sqrt2, 1, inv_sqrt2, 1,\
        -4*(1+ inv_sqrt2), 1, inv_sqrt2, 1, inv_sqrt2);
		Mat id= (Mat_<double>(3, 3) << 0, 0, 0, 0, 1, 0, 0, 0, 0);
		kernel(src, im, kk0, "找邊緣", 1);
		kernel(src, im, id-kk0, "銳利化");
		kernel(src, im, kk1, "找邊緣2", 1);
		kernel(im, im0, kk1, "找邊緣2**2", 1);
		imwrite("找邊緣2_2.png", im0);
		kernel(src, im, id - kk1, "銳利化2");
		kernel(im, im1, id - kk1, "銳利化2**2");
		imwrite("銳利化2_2.png", im1);
		kernel(src, im, kk2, "找邊緣3", 1);
		kernel(im, im, kk2, "找邊緣3**2", 1);
		kernel(src, im,id - kk2, "銳利化3");
		kernel(im, im, id - kk2, "銳利化3**2");
 
		waitKey(0);
 
		return 0;
	}
	catch (exception& e) {
		cerr << e.what();
		return 1;
	}
}

沒有留言:

Related Posts Plugin for WordPress, Blogger...

熱門文章