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;
- }
- }
沒有留言:
張貼留言