图像增强、锐化,利用 Python-OpenCV 来实现 4 种方法!

简介: 图像增强目的使得模糊图片变得更加清晰、图片模糊的原因是因为像素灰度差值变化不大,图片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉解决这个问题的最直接简单办法,放大像素灰度值差值、使图像中的细节更加清晰。

图像增强目的使得模糊图片变得更加清晰、图片模糊的原因是因为像素灰度差值变化不大,图片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉


解决这个问题的最直接简单办法,放大像素灰度值差值、使图像中的细节更加清晰。

目前较为常用的几个方法:伽马变换、线性变换、分段线性变换、直方图均衡化,对于图像对比度增强,都能取得不错的效果!


本文将对每种方法 简单介绍一下,并借助于 Python 、OpenCV 进行代码实现,提前说一下哈,下面处理的图像对象都是单通道灰度图,不是三通道彩色图!


1,线性变换


线性变换的原理是对所有像素值乘上一个扩张因子 微信图片_20220520113340.png,像素值大的变得越大,像素值小的变得越小,从而达到图像增强的效果,这里利用 Numpy 的数组进行操作;

微信图片_20220520113342.png


需要注意的是,像素值最大为255,因此在数组相乘之后需要进行数值截断操作,最终代码如下:

def line_trans_img(img,coffient):
    if len(img.shape) == 3:
        img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    out = 2*img
    #像素截断;;;
    out[out>255] = 255
    out = np.around(out)
    return out


这里 微信图片_20220520113344.png 设置为 2 ,变换结果如下,会看到强光处出现失真效果

微信图片_20220520113347.jpg


line.png

这里对排列图片做一下说明,从左到右依次为 原图灰度图、原图灰度直方图、处理之后的灰度图、处理之后的灰度直方图,以下的图片排列方式相同


2,伽马变换


伽马变换对像素值做的是幂次方变换,主要是图像的灰度级发生改变,转换的原理公式为:

微信图片_20220520113349.png


参数 的设定 可以参照下面:

微信图片_20220520113351.jpgSnipaste_2020-05-26_20-18-17.png


  • >1 时,会减小灰度级较高的地方,增大灰度级较低的地方;
  • <1 时,会增大灰度级较高的地方,减小灰度级较低的地方;
def gama_transfer(img,power1):
    if len(img.shape) == 3:
         img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    img = 255*np.power(img/255,power1)
    img = np.around(img)
    img[img>255] = 255
    out_img = img.astype(np.uint8)
    return out_img


这里 Gamma 分别取 1.5,0.5,结果如下:

微信图片_20220520113353.jpg

gamma1.5.png微信图片_20220520113354.jpg

gamma0.5.png

结果来看,相对来说 对图像增强的结果会更好一点


3,分段线性分割


分段线性分割,提前把图像的灰度级分为几部分,然后对每一部分的像素值做不同的线性变换,像素值基本变换原理:

微信图片_20220520113356.png

这里写的代码总感觉效率特别慢(逐像素改变),知道改进方法的小伙伴们望告知:

def seg_augment_img(img,start,c1,end,c2,b2,c3,b3):
    if len(img.shape) == 3:
         img= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    out_img = np.zeros(img.shape)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if img[i][j] <start:
                out_img[i][j] = img[i][j]*c1
            elif img[i][j] < end:
                out_img[i][j] = img[i][j] *c2 + b2
            else:
                out_img[i][j] = img[i][j] * c3 +b3
    out_img[out_img>255] = 255
    out = np.around(out_img)
    out = out.astype(np.uint8)
    return out


函数中的参数分别为 50,0.5,150,3.6,-310,0.238,194,结果如下:

微信图片_20220520113358.jpgseg_line.png


4,直方图均衡化


每个灰度图像都有自己的灰度直方图,均衡化的原理是,先根据灰度直方图计算累加灰度直方图,根据灰度图与累加灰度图的映射关系关联输入图像与输出图图像的映射关系

映射关系原理如下:

微信图片_20220520113359.png


因此,这里几个重要部分:1,计算出灰度直方图;2,计算累加灰度直方图;3,根据 1 和 2 得到映射关系,最终输出灰度像素值;

def get_imghist(img):
    # 判断图像是否为三通道;
    if len(img.shape) == 3:
        img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 无 Mask,256个bins,取值范围为[0,255]
    hist = cv2.calcHist([img],[0],None,[256],[0,255])
    return hist
def cal_equalhist(img):
    if len(img.shape) == 3:
         img= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    h,w = img.shape[:2]
    grathist = get_imghist(img)
    zerosumMoment = np.zeros([256],np.uint32)
    for p in range(256):
        if p ==0:
            zerosumMoment[p] = grathist[0]
        else:
            zerosumMoment[p] = zerosumMoment[p-1] +grathist[p]
    output_q = np.zeros([256],np.uint8)
    cofficient = 256.0/(h*w)
    for p in range(256):
        q = cofficient *float(zerosumMoment[p]) - 1
        if q >= 0:
            output_q[p] = math.floor(q)
        else:
            output_q[p] = 0
    equalhistimage = np.zeros(img.shape,np.uint8)
    for i in range(h):
        for j in range(w):
            equalhistimage[i][j] = output_q[img[i][j]]
    # 第二种方法,opencv 库函数自带一种:
    #equalhistimage = cv2.equalizeHist(img)
    return equalhistimage


结果如下,看起来还是不错的!(这里图片失真是因为灯光的原因)

微信图片_20220520113401.jpg

equalhist.png


5,小总结


根据以上几个增强方法来看,针对于本案例选取的图像,线性增强方法相对效果并不太好,可能会适用于其它的种类图像,而 Gamma转换  和直方图均衡化取得相对不错的结果

但图像增强、锐化没有最优方法,每种方法都有自己的特点,需要根据自己选择合适的

最后还是要提醒一下感兴趣的小伙伴们,记得跟着敲一下代码,加深一下应用原理!

相关文章
|
12天前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
28 4
|
20天前
|
机器学习/深度学习 人工智能 TensorFlow
使用Python和TensorFlow实现图像识别
【8月更文挑战第31天】本文将引导你了解如何使用Python和TensorFlow库来实现图像识别。我们将从基本的Python编程开始,逐步深入到TensorFlow的高级功能,最后通过一个简单的代码示例来展示如何训练一个模型来识别图像。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息。
127 53
|
1天前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
15 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
4天前
|
机器学习/深度学习 数据采集 算法
数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
有多种方法可以处理时间序列数据中的噪声。本文将介绍一种在我们的研究项目中表现良好的方法,特别适用于时间序列概况中数据点较少的情况。
19 1
数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
|
5天前
|
消息中间件 关系型数据库 数据库
Python实时监测数据库表数据变化的方法
在实现时,需要考虑到应用的实时性需求、数据库性能影响以及网络延迟等因素,选择最适合的方法。每种方法都有其适用场景和限制,理解这些方法的原理和应用,将帮助开发者在实际项目中做出最合适的技术选择。
44 17
|
5天前
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
21 12
|
3天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
1天前
|
存储 数据处理 索引
Python列表操作的方法总结
通过掌握上述方法,你可以有效地操作Python列表,完成各种数据处理任务。列表的灵活性和多功能性使其成为Python编程中不可或缺的工具。
11 1
|
11天前
|
Python
Python中几种lambda排序方法
【9月更文挑战第7天】在Python中,`lambda`表达式常用于配合排序函数,实现灵活的数据排序。对于基本列表,可以直接使用`sorted()`进行升序或降序排序;处理复杂对象如字典列表时,通过`lambda`指定键值进行排序;同样地,`lambda`也适用于根据元组的不同位置元素来进行排序。
|
20天前
|
机器学习/深度学习 人工智能 TensorFlow
利用Python和TensorFlow实现简单图像识别
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段探索人工智能世界的奇妙之旅。正如甘地所言:“你必须成为你希望在世界上看到的改变。” 通过实践,我们不仅将学习如何使用Python和TensorFlow构建一个简单的图像识别模型,而且还将探索如何通过这个模型理解世界。文章以通俗易懂的方式,逐步引导读者从基础到高级,体验从编码到识别的整个过程,让每个人都能在AI的世界中看到自己的倒影。