OpenCV 基于Laplacian算子的图像边缘增强

OpenCV 基于Laplacian算子的图像边缘增强

下面代码实现了基于Laplacian算子的图像边缘增强 。

算法:

边缘增强图像 = 源图像 + 边缘图像

//  基于Laplacian算子的图像边缘增强 
//  Author: http://blog.csdn.net/icvpr 


#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
void edgeEnhance(cv::Mat& srcImg, cv::Mat& dstImg)
{
 if (!dstImg.empty())
 {
  dstImg.release();
 }
 
 std::vector<cv::Mat> rgb;

 if (srcImg.channels() == 3)        // rgb image
 {
  cv::split(srcImg, rgb);
 }
 else if (srcImg.channels() == 1)  // gray image
 {
  rgb.push_back(srcImg);
 }
 
 // 分别对R、G、B三个通道进行边缘增强
 for (size_t i = 0; i < rgb.size(); i++)
 {
  cv::Mat sharpMat8U;
  cv::Mat sharpMat;
  cv::Mat blurMat;

  // 高斯平滑
  cv::GaussianBlur(rgb[i], blurMat, cv::Size(3,3), 0, 0);

  // 计算拉普拉斯
  cv::Laplacian(blurMat, sharpMat, CV_16S);

  // 转换类型
  sharpMat.convertTo(sharpMat8U, CV_8U);
  cv::add(rgb[i], sharpMat8U, rgb[i]);
 }

 
 cv::merge(rgb, dstImg);
}


int main(int argc, char** argv)
{
 cv::Mat image = cv::imread("../test.jpg");
 if (image.empty())
 {
  std::cout<<"read image failure"<<std::endl;
  return -1;
 }

 // rgb
 cv::Mat resultRgb;
 edgeEnhance(image, resultRgb);
 cv::imwrite("../outRgb.jpg", resultRgb);

 // gray
 cv::Mat gray;
 cv::cvtColor(image, gray, CV_BGR2GRAY);
 cv::imwrite("../gray.jpg", gray);

 cv::Mat resultGray;
 edgeEnhance(gray, resultGray);
 cv::imwrite("../outGray.jpg", resultGray); 

 return 0;
}

相关推荐