日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【opencv】25.图像卷积cv::filter2D()以及c++代码实例

發(fā)布時(shí)間:2025/3/21 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【opencv】25.图像卷积cv::filter2D()以及c++代码实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

自己寫圖像銳化函數(shù):

#include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp>using namespace std; using namespace cv;void Sharpen(const Mat& myImage, Mat& Result);int main() {Mat srcImage = imread("1.png");//判斷圖像是否加載成功if(srcImage.data)cout << "圖像加載成功!" << endl << endl;else{cout << "圖像加載失敗!" << endl << endl;return -1;}namedWindow("srcImage", WINDOW_AUTOSIZE);imshow("srcImage", srcImage);Mat dstImage;dstImage.create(srcImage.size(), srcImage.type());Sharpen(srcImage, dstImage);namedWindow("dstImage",WINDOW_AUTOSIZE);imshow("dstImage",dstImage);waitKey(0);return 0; }void Sharpen(const Mat& myImage, Mat& Result) {CV_Assert(myImage.depth() == CV_8U); //判斷函數(shù)CV_Assertconst int nChannels = myImage.channels();for(int j = 1; j < myImage.rows - 1; ++j){const uchar* precious = myImage.ptr<uchar>(j - 1); //當(dāng)前像素上一行指針const uchar* current = myImage.ptr<uchar>(j); //當(dāng)前像素行指針const uchar* next = myImage.ptr<uchar>(j + 1); //當(dāng)前像素下一行指針uchar* output = Result.ptr<uchar>(j);//利用公式和上下左右四個(gè)像素對(duì)當(dāng)前像素值進(jìn)行處理for(int i = nChannels; i < nChannels * (myImage.cols - 1); ++i){// 0, -1 ,0; -1, 5, -1; 0, -1, 0;*output++ = saturate_cast<uchar>(5 * current[i] -current[i-nChannels]-current[i+nChannels]-precious[i]-next[i]);}}Result.row(0).setTo(Scalar(0)); //設(shè)置第一行所有元素值為0Result.row(Result.rows-1).setTo(Scalar(0)); //設(shè)置最后一行所有元素值為0Result.col(0).setTo(Scalar(0)); //設(shè)置第一列所有元素值為0Result.col(Result.cols-1).setTo(Scalar(0)); //設(shè)置最后一列所有元素值為0 }

上面代碼是以卷積核為[0?10?15?10?10]\begin{bmatrix} 0&-1&0\\ -1&5&-1 \\ 0&-1&0 \end{bmatrix}???0?10??15?1?0?10????為例的銳化,結(jié)果圖就是輕微的銳化,這里不做展示。


圖像卷積運(yùn)算API函數(shù): cv::filter2D()

舉例: 直接使用邊緣檢測(cè)的拉普拉斯算子API函數(shù),與自己定義拉普拉斯算子核使用cv::filter2D()的效果對(duì)比:

#include <iostream> #include <string> #include <vector>#include "opencv2/highgui/highgui.hpp" #include "opencv2/opencv.hpp" // g++ test.cpp `pkg-config opencv --libs --cflags` -std=c++11 -pthread -o testusing namespace std; using namespace cv;const int Kenel_s = 3; //卷積核大小int main() {//讀入圖片Mat src, dst, dst_L;src = imread("1.png", 0);// copyMakeBorder(src, src, Kenel_s - 1, Kenel_s - 1, Kenel_s - 1, Kenel_s -// 1, BORDER_CONSTANT, Scalar(0)); //填充圖像imshow("Image of src", src);dst = src.clone();cv::Laplacian(dst, dst, dst.depth());imshow("Image of Laplacian API", dst);// cv::Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);// cv::Mat kernel = (Mat_<char>(3, 3) << -1, -1, -1, -1, 8, -1, -1, -1, -1);cv::Mat kernel = (Mat_<char>(3, 3) << 1, 1, 1, 1, -8, 1, 1, 1, 1);cv::filter2D(src, src, CV_8UC3, kernel);imshow("Image of Laplacian 2", src);while (waitKey(0) != 'q') {};return 0; }

origin:

API:

cv::filter2D():

總結(jié)

以上是生活随笔為你收集整理的【opencv】25.图像卷积cv::filter2D()以及c++代码实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。