参考:
https://www.cnblogs.com/wangguchangqing/category/740760.html
1. 拉普拉斯算子锐化
算法实现:
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("D:\\学习资料\\C++\\C++ code\\图像处理算法opencv实现\\图像处理算法opencv实现\\2.jpg",CAP_MODE_GRAY);
//opencv的sample中有图片,可以用samples::findFile找到图片
//src = imread(samples::findFile(imageName), IMREAD_COLOR);
namedWindow("OriginalImage");
imshow("OriginalImage", src);
//1、拉普拉斯锐化
Mat lp;
Mat kernel = (Mat_<short>(3, 3) << 1, 1, 1, 1, -8, 1, 1, 1, 1);//Laplace算子
filter2D(src, lp, CV_16S, kernel, Point(-1, -1), 0, BORDER_DEFAULT);
//上面两句可以用下面的opencv的Laplacian函数代替
//Laplacian(src, lp, CV_16S, 3);
//显示拉普拉斯锐化图像
Mat show_lp;
lp.convertTo(show_lp, CV_8U);
namedWindow("Laplacian-filtered image");
imshow("Laplacian-filtered image", show_lp);
//2、对锐化的图像进行scale,使其更好显示
int rows = lp.rows;
int cols = lp.cols;
Mat scaled_lp(rows, cols, CV_16S);
//下面这个是可以直接把lp取绝对值,然后再变成CV_8U,但效果跟原来的lp没什么区别
//convertScaleAbs(lp, scaled_lp);
short max = lp.at<short>(0, 0);
short min = lp.at<short>(0, 0);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
short temp = lp.at<short>(i, j);
if (temp > max) {
max = temp;
}
if (temp < min) {
min = temp;
}
}
}
//cout << "max: " << max << endl;
//cout << "min: " << min << endl;
//归一化为0 - 255
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
short& val = scaled_lp.at<short>(i, j);
short val1 = lp.at<short>(i, j);
val = (val1 - min) * 255 / (max - min);
}
}
scaled_lp.convertTo(scaled_lp, CV_8U);
//显示
namedWindow("scaled_lp");
imshow("scaled_lp", scaled_lp);
//3、将scale后的拉普拉斯锐化图像和原图像进行混合
src.convertTo(src, CV_16S);
//lp.convertTo(lp, CV_16S);
Mat enhancedImg(rows, cols, CV_16S);
enhancedImg = src - lp;
//这段其实可以不要,因为convertTo到CV_8U的时候会自动将范围之外的值自动变成0和255
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
short& temp = enhancedImg.at<short>(i, j);
if (temp > 255) {
temp = 255;
}
else if (temp < 0) {
temp = 0;
}
}
}
//将范围scale到0-255,但效果不好
/*for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
short temp = enhancedImg.at<short>(i, j);
if (temp > max) {
max = temp;
}
if (temp < min) {
min = temp;
}
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
short& val = enhancedImg.at<short>(i, j);
val = (val - min) * 255 / (max - min);
}
}*/
enhancedImg.convertTo(enhancedImg, CV_8U);
//显示
namedWindow("enhancedImg");
imshow("enhancedImg", enhancedImg);
waitKey(0);
return 0;
}
算法结果:

2. 直方图均衡图像增强对比度
算法实现:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("D:\\学习资料\\C++\\C++ code\\图像处理算法opencv实现\\图像处理算法opencv实现\\lena.jpg",1);
if (image.empty())
{
std::cout << "打开图片失败,请检查" << std::endl;
return -1;
}
namedWindow("original image");
imshow("original image", image)

本文详细介绍了如何使用OpenCV库实现图像处理中的拉普拉斯锐化、直方图均衡化、对数变换、伽玛变换以及各种滤波方法,包括方框滤波、均值滤波、高斯滤波、中值滤波和双边滤波。每种技术的原理、实现代码和效果展示均进行了详细阐述,旨在提升图像的对比度和细节表现力。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



