💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》
📝《C++》
📝《Qt》
图像处理过程,有些弱场景中的物体细节模糊,对比度弱,为了突出弱场景中的物体细节,不放大噪声的同时,保持原有的高频信息,可以考虑图像锐化进行增强处理。
目录
一、imsharpen函数
1.1 原理
Matlab中提供了非锐化掩膜方法用于图像锐化增强,其算法原理为:
(1)对图像应用高斯模糊(平滑),得到模糊图像G(也叫背景层或低频图)。
(2)计算原始图像与模糊图像的差值,即边缘增强图像
E
=
I
−
G
E = I - G
E=I−G。(得到的图像也叫细节层或高频图)
(3)用原始图像I加权增强图像E进行加权叠加:
I
s
h
a
r
p
e
n
e
d
=
I
+
A
m
o
u
n
t
×
255
I_{sharpened}=I+Amount × 255
Isharpened=I+Amount×255
其中Amount控制锐化强度。
1.2 matlab代码
测试单帧图像的matlab代码见下:
% 读取图像
img = imread("F:\\Code\\Matlab\\8.bmp");
% 生成保存路径,假设 num 是图像循环编号
num = 1; % 示例循环编号
output_folder = "F:\\Code\\Matlab\\image_sharp\\INF_DongGuang_256190_20240806_ResizeX2\\"; % 指定输出文件夹
output_filename = sprintf("8_%d_2.bmp", num); % 动态生成文件名
adressString = fullfile(output_folder, output_filename); % 合并为完整路径
% 图像锐化处理
% 参数作用:
% Amount:边缘增强的权重,值越大,锐化效果越强。
% Radius:高斯模糊的半径,决定边缘检测的范围。
% Threshold:忽略边缘对比度变化低于阈值的区域,抑制噪声。
sharpened_img = imsharpen(img, 'Amount', 1.5, 'Radius', 2,'Threshold',0);
% 保存锐化后的图像
if ~isfolder(output_folder)
mkdir(output_folder); % 如果输出文件夹不存在,则创建
end
imwrite(sharpened_img, adressString);
% 显示锐化后的图像
imshow(sharpened_img);
disp(['图像已保存到: ', adressString]);
二、Python代码复现
上面Matlab已经将锐化方法封装在了imsharpen函数中,下面根据锐化原理使用Python复现。
2.1 单帧图像锐化
2.1.1 代码介绍
下面是整个锐化函数,我封装在了unsharp_mask函数中,见下:
学者使用代码是需要修改参数主要为导入图像路径和调整锐化强度参数,见下:
2.1.2 Y通道锐化和BGR三通道锐化对比
代码中我把输入的BGR图像转为YCrCb图像,并仅对Y通道(亮度)进行的锐化处理,Cr(色调)和Cb(饱和度),最后将锐化处理后的Y通道再和Cr、Cb通道合并,转回BGR格式,之所以这么做是为了避免对彩色图像锐化处理时出现类似卡通效应,下面是一个对比图,左侧图为原图,中间图为彩色图直接锐化处理结果,右侧图为仅对Y通道锐化处理结果:
从上面可以看出,右图过度锐化。
如果锐化效果不需要过强,也可以将unsharp_mask函数的增强因子减小,直接BGR三通道锐化,不会出现卡通效用,具体代码修改见下,注释YCrCb相关代码即可:
此方法的处理结果见下,左图为原图,右图为BGR三通道较弱锐化,色彩相比原图,鲜艳了很多,我还是推荐仅在Y通道上处理的方案,看起来要自然一些,容易控制增强因子参数。
2.1.3 代码
下面代码是处理单帧图像的,仅对Y通道进行锐化处理。
import cv2
import numpy as np
from scipy.ndimage import gaussian_filter
def unsharp_mask(image,amount= 1.0,radius=1.0,threshold=0):
'''
使用非锐化掩膜技术对图像进行锐化
:param image: 输入图像,uint8格式
:param amount: 锐化强度
:param radius: 高斯模糊核半径
:param threshold: 锐化的最小对比度变化阈值
:return:
'''
# 确保图像为浮点型并进行归一化处理
image = image.astype(np.float32) / 255.0
# 高斯模糊处理
blurred = gaussian_filter(image,sigma = radius)
# 计算边缘增强图像
mask = image - blurred
# 应用阈值(忽略小的对比度变化)
mask[np.abs(mask) < threshold / 255.5] = 0
# 进行图像锐化处理
sharpend = image + amount * mask
# 将值限制在[0,1]之间
sharpend = np.clip(sharpend,0,1)
# 转换为uint8格式
sharpend = (sharpend * 255).astype(np.uint8)
return sharpend
# 读取图像
image = cv2.imread(r"Images/Visible_Images/1.jpg",-1)
image_YCrCb = cv2.cvtColor(image,cv2.COLOR_BGR2YCrCb)
image_y,image_Cr,image_Cb = cv2.split(image_YCrCb)
# 调用上面锐化函数处理
sharpend_y = unsharp_mask(image_y,amount= 2,radius=2,threshold=0)
# 通道合并
sharpend_result = cv2.merge((sharpend_y,image_Cr,image_Cb))
# 转回BGR格式
sharpend_result = cv2.cvtColor(sharpend_result,cv2.COLOR_YCrCb2BGR)
# 保存并显示结果
cv2.imwrite('Result/Visible_Gaussian_sharpened/sharpend_result_3.bmp',sharpend_result)
cv2.imshow("input_image",image)
cv2.imshow("sharpend_result",sharpend_result)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 批量图像锐化
批量图像锐化代码主要是在上面单帧图像锐化代码基础上加了些遍历文件夹代码,先使用上面脚本确定好锐化参数后,再使用本小结代码批量处理自己需要锐化的样本集。
2.2.1 参数修改
使用批量图像锐化代码需要修改的参数见下:
threshold参数是用于抑制噪声的,如果图像有噪声,将threshold参数赋值0.1或其它较小值,有去噪功能,太大值细节会模糊损失。
2.2.2 代码
批量图像锐化完整代码见下:
import os
import cv2
import numpy as np
from scipy.ndimage import gaussian_filter
from tqdm import tqdm
def unsharp_mask(image,amount= 1.0,radius=1.0,threshold=0):
'''
使用非锐化掩膜技术对图像进行锐化
:param image: 输入图像,uint8格式
:param amount: 锐化强度
:param radius: 高斯模糊核半径
:param threshold: 锐化的最小对比度变化阈值
:return:
'''
# 确保图像为浮点型并进行归一化处理
image = image.astype(np.float32) / 255.0
# 高斯模糊处理
blurred = gaussian_filter(image,sigma = radius)
# 计算边缘增强图像
mask = image - blurred
# 应用阈值(忽略小的对比度变化)
mask[np.abs(mask) < threshold / 255.5] = 0
# 进行图像锐化处理
sharpend = image + amount * mask
# 将值限制在[0,1]之间
sharpend = np.clip(sharpend,0,1)
# 转换为uint8格式
sharpend = (sharpend * 255).astype(np.uint8)
return sharpend
folder_path = r"F:\Code\Python\Images\ta_ResizeX2_rename"
output_path = r"F:\Code\Python\Result\Gaussin_filter_sharpend"
# 遍历文件夹中所有图像
image_list = os.listdir(folder_path)
for file_name in tqdm(image_list,desc="processing"):
file_path = os.path.join(folder_path,file_name)
if os.path.isfile(file_path) and file_name.lower().endswith(('.png', ('.jpg'), ('.jpeg'), ('.bmp'))):
# 读取图像
image = cv2.imread(file_path,-1)
# 将原图转为YCrCb色彩空间,对Y通道进行锐化处理
image_YCrCb = cv2.cvtColor(image,cv2.COLOR_BGR2YCrCb)
image_y,image_Cr,image_Cb = cv2.split(image_YCrCb)
# 调用上面锐化函数处理
sharpend_y = unsharp_mask(image_y,amount= 2,radius=2,threshold=0)
# 通道合并
sharpend_result = cv2.merge((sharpend_y,image_Cr,image_Cb))
# 转回BGR格式
sharpend_result = cv2.cvtColor(sharpend_result,cv2.COLOR_YCrCb2BGR)
# output_name = file_name
output_name = file_name[:-4] + '_1_sharpend.bmp'
print(output_name)
cv2.imwrite(os.path.join(output_path,output_name),sharpend_result)
三、锐化效果展示
下面展示图中,左图为原图,右图为Y通道锐化后结果。
四、总结
以上就是复现Matlab中imsharpen函数图像锐化方法的详细过程,希望能帮到你。
感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖
关注下面「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!