图像锐化、直方图均衡、图像增强、图像滤波

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

参考

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值