文章目錄
- 前言
- 1、什么是圖像銳化
- 2、使用卷積對圖像進行銳化
- (1).圖像預處理
- (2).定義銳化卷積核
- (3).對圖像進行卷積操作(實現圖像銳化)
- 3、手動遍歷實現圖像銳化
- 總結
前言
提示:本文主要通過手寫圖像銳化算法來理解圖像像素的遍歷:
我們知道圖像的高斯模糊的在實踐中是使用高斯卷積核來卷積處理圖像的,高斯卷積核“卷”圖像的結果是被卷的圖像區域變模糊了。而本文要講解的圖像銳化則是將圖像更加清晰。
提示:以下是本篇文章正文內容,下面案例可供參考
1、什么是圖像銳化
圖像銳化是一種圖像處理技術,旨在增強圖像中邊緣和細節的對比度,使其看起來更加清晰和鮮明。
2、使用卷積對圖像進行銳化
(1).圖像預處理
代碼如下(示例):這里對圖像先進行了高斯模糊處理,目的是去除噪音,防止銳化后加重噪音的影響
cv::Mat imRead = cv::imread("xxx.jpeg");
cv::GaussianBlur(imRead, imRead, cv::Size(3,3),0);
(2).定義銳化卷積核
代碼如下(示例):
cv::Mat kernel_sharpen = (cv::Mat_<int>(3,3)<< 0, -1, 0,-1, 5, -1,0, -1, 0);
(3).對圖像進行卷積操作(實現圖像銳化)
代碼如下(示例):
cv::filter2D(imRead, imRead, imRead.type(), kernel_sharpen);
總代碼如下:
cv::Mat imRead = cv::imread(strPth01);
cv::GaussianBlur(imRead, imRead, cv::Size(3,3),0);
//定義銳化卷積核
cv::Mat kernel_sharpen = (cv::Mat_<int>(3, 3) << 0, -1, 0,-1, 5, -1,0, -1, 0);
cv::Mat imSharpen;
cv::filter2D(imRead, imSharpen, imRead.type(), kernel_sharpen);
3、手動遍歷實現圖像銳化
手動遍歷像素實現圖像的銳化操作
下列函數使用了at訪問圖像像素,可根據自己的需求使用ptr、iterator等訪問像素,代碼如下(可直接使用):
/*@author @還下著雨ZG
* @param[in] imSrc, 源圖像,即待銳化的圖像
* @param[out] imDst, 目標圖像,即銳化后的圖像
* @return int, 正表示銳化成功,負表示失敗
*/
int ImgSharpenBySelf(const cv::Mat& imSrc, cv::Mat& imDst)
{if(imSrc.empty()) return -1;if(!imDst.empty()) imDst.release();if(imSrc.channels()==1){cv::Mat imCopy;imSrc.convertTo(imCopy,CV_32SC1);imDst = imCopy.clone();for(int r=1; r<imCopy.rows-1; ++r){for(int c=1; c<imCopy.cols-1; ++c){//這里使用int來訪問圖像像素元素imDst.at<int>(r,c) = 5*imCopy.at<int>(r,c)- imCopy.at<int>(r-1,c) - imCopy.at<int>(r+1,c)- imCopy.at<int>(r,c-1)- imCopy.at<int>(r,c+1);}}//將目標圖像(銳化后的圖像)轉為CV_8UC1imDst.convertTo(imDst, CV_8U);}else if(imSrc.channels()==3){//轉換圖像格式便于計算(防止溢出)cv::Mat imCopy;imSrc.convertTo(imCopy,CV_32SC3);imDst = imCopy.clone();//遍歷圖像并處理像素 new = 5*current - left - top - right - bottomfor(int r=1; r<imCopy.rows-1; ++r){for(int c=1; c<imCopy.cols-1; ++c){//這里使用int來訪問圖像像素元素imDst.at<cv::Vec3i>(r,c) = 5*imCopy.at<cv::Vec3i>(r,c)- imCopy.at<cv::Vec3i>(r-1,c) - imCopy.at<cv::Vec3i>(r+1,c)- imCopy.at<cv::Vec3i>(r,c-1)- imCopy.at<cv::Vec3i>(r,c+1);}}//將目標圖像(銳化后的圖像)轉為CV_8UC1imDst.convertTo(imDst, CV_8UC3);}else {return -2;}return 1;
}
總結
1.使用opencv自帶的卷積函數filter2D和卷積核kernel來銳化圖像
2.手動遍歷圖像(灰度圖像或彩色圖像)實現圖像的銳化操作