下面代码实现了基于Laplacian算子的图像边缘增强 。
算法:
边缘增强图像 = 源图像 + 边缘图像
// 基于Laplacian算子的图像边缘增强 // Author: www.icvpr.com // Blog: 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; }
相关内容:www.icvpr.com