文章目录
- 一、简介:
- 二、图像清晰度增强方案:
- 三、算法实现步骤
- 3.1高反差保留实现
- 3.2. usm锐化
- 3.3 Overlay叠加
- 四:整体代码实现
- 五:效果
一、简介:
你是否有过这样的烦恼,拍出来的照片总是不够清晰,显得雾蒙蒙的?其实,通过一些简单的技巧,我们可以让这些模糊的照片焕发新生。首先,让我们来了解一下什么是图像清晰度。简单来说,图像清晰度就是指图片中的细节是否清晰可见。一张清晰的照片,细节丰富,边缘分明;而一张模糊的照片,则细节丢失,看起来不够锐利。图像清晰度增强就是指通过一系列算法和技术手段提高图像的视觉效果,使图像中的细节更加清晰,边缘更加锐利,整体图像更加鲜明。
二、图像清晰度增强方案:
二、图像清晰度增强方案:
为了提升图像的清晰度,我们制定了以下增强方案:
高反差保留:首先,我们对原图进行高反差保留处理,这一步骤旨在保留图像中的高频细节,如边缘和纹理,同时过滤掉低频的背景噪声。通过这种方式,图像的细节得到强化,而不会引入额外的噪声。
USM锐化:接着,我们对图像进行USM(Unsharp Masking)锐化处理。USM锐化是一种常用的图像增强技术,它通过增强图像的边缘对比度来提高图像的清晰度。这一步骤将进一步突出图像的细节,使图像看起来更加锐利。
细节图与原图叠加:最后,我们将经过USM锐化处理的细节图与原始图像进行叠加。这一步骤通过合并原始图像的色彩信息和锐化后的细节信息,实现图像清晰度的整体提升。
具体实施步骤如下:
对原图进行小核高斯模糊处理,这一步骤有助于进一步去除图像上的噪声,为后续的细节保留和锐化打下良好的基础。对去噪后的图像应用高反差保留,以保留图像中的细节信息。
对保留细节后的图像进行USM锐化,以增强图像的边缘和细节。将锐化后的细节图与原始图像进行叠加,通过叠加处理,最终的图像既保留了原始色彩,又增强了清晰度和细节。
通过上述方案,我们可以有效地提升图像的清晰度,使图像更加符合视觉审美和实际应用的需求。
三、算法实现步骤
3.1高反差保留实现
高反差保留是一种图像处理技术,它的主要目的是强化图像中的细节和边缘,同时尽量保持图像的整体亮度不变。简而言之,高反差保留的过程如下:
识别反差:首先,算法会分析图像中的每个像素与其周围像素之间的反差程度。反差通常是通过计算像素值的梯度来确定的,梯度越大,反差就越明显。
保留反差:在识别出反差之后,算法会将这些反差信息保留下来。具体来说,就是将那些反差较大的像素点保留其原始值,而将反差较小的像素点(通常是图像的平坦区域)转换为接近中间灰度的值。
融合图像:最后,将经过反差保留处理的图像与原始图像进行融合。这样,原始图像中的低反差区域(如平滑过渡的色彩或亮度区域)会保持不变,而高反差区域(如边缘和细节)则会得到增强。
高反差保留的效果是使图像的细节更加突出,而不会显著改变图像的整体色调。这种技术在图像增强、锐化处理以及艺术效果制作中非常常用
代码如下:
def high_reserve(img, ksize, sigm):
# 将输入图像转换为浮点数,以便进行后续的数学运算
img = img * 1.0
# 使用高斯模糊对图像进行模糊处理,ksize是高斯核的大小,sigm是高斯核的标准差
gauss_out = cv2.GaussianBlur(img, (ksize, ksize), sigm)
# 计算原始图像与高斯模糊后的图像之差,然后加上128以调整亮度
img_out = img - gauss_out + 128
# 将图像数据缩放到0到1的范围内,便于后续处理
img_out = img_out / 255.0
# 饱和处理,防止像素值超出0到1的范围
# 创建一个掩码,标记小于0的像素
mask_1 = img_out < 0
# 创建一个掩码,标记大于1的像素
mask_2 = img_out > 1
# 将小于0的像素值设置为0
img_out = img_out * (1 - mask_1)
# 将大于1的像素值设置为1
img_out = img_out * (1 - mask_2) + mask_2
# 返回处理后的图像
return img_out
3.2. usm锐化
USM(Unsharp Masking,非锐化掩蔽)锐化是一种常用的图像处理技术,用于增强图像的边缘和细节,使图像看起来更加清晰和鲜明。以下是USM锐化的基本原理和步骤:
原理:USM锐化的核心思想是先模糊原图像,然后从原图中减去这个模糊的版本,最后将得到的边缘增强结果与原图混合,以此来提升图像的清晰度。
步骤:
1.高斯模糊:首先,对原始图像应用高斯模糊。这个过程会创建一个模糊版本的图像,模糊的程度由用户设定的半径(radius)参数控制。
2. 边缘提取:接下来,从原始图像中减去模糊的图像。这个操作会突出图像中的边缘和细节,因为这些区域在减法操作后会有较高的对比度。
3. 混合:最后,将提取出的边缘信息与原始图像进行混合。混合的比例由用户设定的数量(amount)参数控制,这个参数决定了锐化效果的强度。
代码如下:
def usm(img, number):
# 使用高斯模糊对原始图像进行模糊处理,(0, 0)表示核大小自动根据sigma值计算
# number参数是高斯核的标准差sigma,控制模糊的程度
blur_img = cv2.GaussianBlur(img, (0, 0), number)
# 使用addWeighted函数对原始图像和模糊图像进行混合
# 参数1.5和-0.5分别是原始图像和模糊图像的权重,0是加到混合结果上的常数
# 这里的权重设置使得混合结果中原始图像的边缘和细节得到增强
usm = cv2.addWeighted(img, 1.5, blur_img, -0.5, 0)
# 返回USM锐化处理后的图像
return usm
3.3 Overlay叠加
Overlay”(叠加)是一种混合模式,它用于将两个图层的内容以特定的方式混合在一起,创造出一系列视觉效果。叠加混合模式通常用于增强图像的对比度和饱和度,同时保留底层图层的细节。
叠加混合模式的效果取决于底层图层的亮度。它根据底层图层的亮度来调整混合图层(即顶层图层)的颜色,遵循以下规则:
1. 当底层图层像素的亮度低于50%时:
叠加混合模式会将顶层图层的颜色与底层图层进行“乘法”混合。这会导致底层较暗的区域变得更暗,从而增强对比度。
2. 当底层图层像素的亮度高于50%时:
叠加混合模式会将顶层图层的颜色与底层图层进行“屏幕”混合。这会导致底层较亮的区域变得更亮,同样增强对比度。
代码实现:
def Overlay(target, blend):
# 创建一个布尔型掩码,其中blend小于0.5的像素位置为True,否则为False
mask = blend < 0.5
# 使用掩码对图像进行分区域处理
# 当掩码为True时(即blend小于0.5),使用公式2 * target * blend计算混合结果
# 当掩码为False时(即blend大于等于0.5),使用公式1 - 2 * (1 - target) * (1 - blend)计算混合结果
img = 2 * target * blend * mask + (1 - mask) * (1 - 2 * (1 - target) * (1 - blend))
# 返回处理后的图像
return img
注:
2 * target * blend * mask:
mask 是一个布尔数组,它表示混合图层 blend 中像素值小于0.5的位置。
当 mask 为 True 时,即 blend 的像素值小于0.5,这个部分会被激活。
2 * target * blend 实现了“乘法”混合效果,这会使得较暗的区域变得更暗,增强对比度。
(1 - mask):
这是一个反掩码,它表示混合图层 blend 中像素值大于等于0.5的位置。
当 mask 为 False 时,即 blend 的像素值大于等于0.5,这个部分会被激活。
(1 - 2 * (1 - target) * (1 - blend)):
这个表达式实现了“屏幕”混合效果,当 blend 的像素值大于等于0.5时应用。
(1 - target) 和 (1 - blend) 分别计算了目标图层和混合图层像素值的补数。
2 * (1 - target) * (1 - blend) 实现了补数的“乘法”混合,然后通过 1 - 取反,得到“屏幕”混合效果,这会使得较亮的区域变得更亮。
四:整体代码实现
import cv2
import numpy as np
def high_reserve(img,ksize,sigm):
img = img * 1.0
gauss_out = cv2.GaussianBlur(img,(ksize,ksize),sigm)
img_out = img - gauss_out + 128
img_out = img_out/255.0
# 饱和处理
mask_1 = img_out < 0
mask_2 = img_out > 1
img_out = img_out * (1-mask_1)
img_out = img_out * (1-mask_2) + mask_2
return img_out
def usm(img ,number):
blur_img = cv2.GaussianBlur(img, (0, 0), number)
usm = cv2.addWeighted(img, 1.5, blur_img, -0.5, 0)
return usm
def Overlay(target, blend):
mask = blend < 0.5
img = 2 * target * blend * mask + (1 - mask) * (1 - 2 * (1 - target) * (1 - blend))
return img
img = cv2.imread(r'F:\traditional_vison\R-C.png')
img_gas = cv2.GaussianBlur(img,(3,3),1.5)
# img = cv2.resize(img,(640,480))
# print(img.shape)
high = high_reserve(img_gas,11,5)
usm1 = usm(high,11)
add = (Overlay(img_gas/255,usm1)*255).astype(np.uint8)
cv2.imshow("de_blur",add)
cv2.imshow("img_gas",img_gas)
# add=cv2.medianBlur((add*255).astype(np.uint8),3)
# cv2.imwrite(r"E:\PS\R-C (1).jpg",add)
cv2.waitKey(0)
五:效果
左侧为原始图像,右侧为增强后的图像