【计算机视觉系列实战教程 (实战01)】:图像锐化操作(并手写锐化操作)

文章目录


前言

提示:本文主要通过手写图像锐化算法来理解图像像素的遍历:

我们知道图像的高斯模糊的在实践中是使用高斯卷积核来卷积处理图像的,高斯卷积核"卷"图像的结果是被卷的图像区域变模糊了。而本文要讲解的图像锐化则是将图像更加清晰。


提示:以下是本篇文章正文内容,下面案例可供参考

1、什么是图像锐化

图像锐化是一种图像处理技术,旨在增强图像中边缘和细节的对比度,使其看起来更加清晰和鲜明。

2、使用卷积对图像进行锐化

(1).图像预处理

代码如下(示例):这里对图像先进行了高斯模糊处理,目的是去除噪音,防止锐化后加重噪音的影响

cpp 复制代码
cv::Mat imRead = cv::imread("xxx.jpeg");
cv::GaussianBlur(imRead, imRead, cv::Size(3,3),0);

(2).定义锐化卷积核

代码如下(示例):

cpp 复制代码
cv::Mat kernel_sharpen = (cv::Mat_<int>(3,3)<< 0, -1, 0,
											  -1, 5, -1,
											   0, -1, 0);

(3).对图像进行卷积操作(实现图像锐化)

代码如下(示例):

cpp 复制代码
cv::filter2D(imRead, imRead, imRead.type(), kernel_sharpen);

总代码如下:

cpp 复制代码
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等访问像素,代码如下(可直接使用):

cpp 复制代码
/*@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_8UC1
		imDst.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 - bottom
		for(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_8UC1
		imDst.convertTo(imDst, CV_8UC3);
	}
	else 
	{
		return -2;
	}
	return 1;
}

总结

1.使用opencv自带的卷积函数filter2D和卷积核kernel来锐化图像

2.手动遍历图像(灰度图像或彩色图像)实现图像的锐化操作

相关推荐
挣扎与觉醒中的技术人1 分钟前
如何优化FFmpeg拉流性能及避坑指南
人工智能·深度学习·性能优化·ffmpeg·aigc·ai编程
watersink5 分钟前
Dify框架下的基于RAG流程的政务检索平台
人工智能·深度学习·机器学习
脑极体8 分钟前
在MWC2025,读懂华为如何以行践言
大数据·人工智能·华为
DeepBI11 分钟前
AI+大数据:DeepBI重构竞品分析新思路
人工智能
KoiC13 分钟前
内网环境部署Deepseek+Dify,构建企业私有化AI应用
linux·人工智能·ubuntu·docker·大模型·ai应用·deepseek
程序员Linc23 分钟前
计算机视觉 vs 机器视觉 | 机器学习 vs 深度学习:核心差异与行业启示
深度学习·机器学习·计算机视觉·机器视觉
不去幼儿园23 分钟前
【启发式算法】Dijkstra算法详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法·图搜索算法
飞30030 分钟前
TP-LINK图像处理工程师(深圳)内推
图像处理·计算机视觉·业界资讯
云卓SKYDROID34 分钟前
无人机投屏技术解码过程详解!
人工智能·5g·音视频·无人机·科普·高科技·云卓科技
zy_destiny40 分钟前
【YOLOv12改进trick】三重注意力TripletAttention引入YOLOv12中,实现遮挡目标检测涨点,含创新点Python代码,方便发论文
网络·人工智能·python·深度学习·yolo·计算机视觉·三重注意力