跟我学Python丨图像增强及运算:局部直方图均衡化和自动色彩均衡化处理

跟我学,python,图像增强,运算,局部,直方图,均衡化,自动,色彩,处理 · 浏览次数 : 251

小编点评

#图像局部直方图均衡化和自动色彩均衡化处理 **1.图像局部直方图均衡化** *使用 Matplotlib 库对图像直方图进行均衡化处理。 *设置均衡化后的直方图范围,为[0,1]。 *使用 np.clip 函数对直方图的每个像素值进行调整,以使其在[0,1]范围内。 **2.自动色彩均衡化** *使用 Matplotlib 库对图像直方图进行均衡化处理。 *设置均衡化后的直方图范围,为[0,1]。 *使用 np.clip 函数对直方图的每个像素值进行调整,以使其在[0,1]范围内。 *使用 np.clip 函数对直方图的每个像素值进行调整,以使其在[0,1]范围内。 *使用 np.clip 函数对直方图的每个像素值进行调整,以使其在[0,1]范围内。 **3.结果** *图像局部直方图均衡化后的直方图,在[0,1]范围内。 *图像自动色彩均衡化的直方图,在[0,1]范围内。 **4.代码** ```python import matplotlib.pyplot as plt import numpy as np #图像直方图均衡化 plt.imshow(image, cmap='jet') plt.colorbar() plt.image(image, cmap='jet') #自动色彩均衡化 plt.imshow(image, cmap='jet') plt.colorbar() plt.image(image, cmap='jet') plt.show() ``` **5.总结** *图像局部直方图均衡化可以有效地处理图像的直方图信息。 *图像自动色彩均衡化可以有效地处理图像的色彩信息。 *这两个算法可以广泛应用于图像增强、图像去噪、图像去雾等领域。

正文

摘要:本文主要讲解图像局部直方图均衡化和自动色彩均衡化处理。这些算法可以广泛应用于图像增强、图像去噪、图像去雾等领域。

本文分享自华为云社区《[Python从零到壹] 五十四.图像增强及运算篇之局部直方图均衡化和自动色彩均衡化处理》,作者: eastmount。

一.局部直方图均衡化

前文通过调用OpenCV中equalizeHist()函数实现直方图均衡化处理,该方法简单高效,但其实它是一种全局意义上的均衡化处理,很多时候这种操作不是很好,会把某些不该调整的部分给均衡处理了。同时,图像中不同的区域灰度分布相差甚远,对它们使用同一种变换常常产生不理想的效果,实际应用中,常常需要增强图像的某些局部区域的细节。

为了解决这类问题,Pizer等提出了局部直方图均衡化的方法(AHE),但AHE方法仅仅考虑了局部区域的像素,忽略了图像其他区域的像素,且对于图像中相似区域具有过度放大噪声的缺点。为此K. Zuiderveld等人提出了对比度受限CLAHE的图像增强方法,通过限制局部直方图的高度来限制局部对比度的增强幅度,从而限制噪声的放大及局部对比度的过增强,该方法常用于图像增强,也可以被用来进行图像去雾操作[1-2]。

在OpenCV中,调用函数createCLAHE()实现对比度受限的局部直方图均衡化。它将整个图像分成许多小块(比如按10×10作为一个小块),那么对每个小块进行均衡化。这种方法主要对于图像直方图不是那么单一的(比如存在多峰情况)图像比较实用。其函数原型如下所示:

retval = createCLAHE([, clipLimit[, tileGridSize]])

  • clipLimit参数表示对比度的大小
  • tileGridSize参数表示每次处理块的大小

调用createCLAHE()实现对比度受限的局部直方图均衡化的代码如下:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('lena.bmp')
#灰度转换
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#局部直方图均衡化处理
clahe = cv2.createCLAHE(clipLimit=2, tileGridSize=(10,10))
#将灰度图像和局部直方图相关联, 把直方图均衡化应用到灰度图 
result = clahe.apply(gray)
#显示图像
plt.subplot(221)
plt.imshow(gray, cmap=plt.cm.gray), plt.axis("off"), plt.title('(a)') 
plt.subplot(222)
plt.imshow(result, cmap=plt.cm.gray), plt.axis("off"), plt.title('(b)') 
plt.subplot(223)
plt.hist(img.ravel(), 256), plt.title('(c)') 
plt.subplot(224)
plt.hist(result.ravel(), 256), plt.title('(d)') 
plt.show()

输出结果如图1所示,图1(a)为原始图像,对应的直方图为图1©,图1(b)和图1(d)为对比度受限的局部直方图均衡化处理后的图像及对应直方图,它让图像的灰度值分布更加均衡。可以看到,相对于全局的直方图均衡化,这个局部的均衡化似乎得到的效果更自然一点。

二.自动色彩均衡化

Retinex算法是代表性的图像增强算法,它根据人的视网膜和大脑皮层模拟对物体颜色的波长光线反射能力而形成,对复杂环境下的一维条码具有一定范围内的动态压缩,对图像边缘有着一定自适应的增强。自动色彩均衡(Automatic Color Enhancement,ACE)算法是在Retinex算法的理论上提出的,它通过计算图像目标像素点和周围像素点的明暗程度及其关系来对最终的像素值进行校正,实现图像的对比度调整,产生类似人体视网膜的色彩恒常性和亮度恒常性的均衡,具有很好的图像增强效果[3-4]。

ACE算法包括两个步骤,一是对图像进行色彩和空域调整,完成图像的色差校正,得到空域重构图像;二是对校正后的图像进行动态扩展。ACE算法计算公式如下:

其中,W是权重参数,离中心点像素越远的W值越小;g是相对对比度调节参数,其计算方法如公式(22-2)所示,a表示控制参数,值越大细节增强越明显。

图2是条形码图像进行ACE图像增强后的效果图,通过图像增强后的图(b)对比度更强,改善了原图像的明暗程度,增强的同时保持了图像的真实性。

由于OpenCV中暂时没有ACE算法包,下面的代码是借鉴“zmshy2128”老师的文章,修改实现的彩色直方图均衡化处理[5]。

# -*- coding: utf-8 -*-
# By:Eastmount
# 参考zmshy2128老师文章
import cv2
import numpy as np
import math
import matplotlib.pyplot as plt
#线性拉伸处理
#去掉最大最小0.5%的像素值 线性拉伸至[0,1]
def stretchImage(data, s=0.005, bins = 2000): 
 ht = np.histogram(data, bins);
    d = np.cumsum(ht[0])/float(data.size)
 lmin = 0; lmax=bins-1
 while lmin<bins:
 if d[lmin]>=s:
 break
 lmin+=1
 while lmax>=0:
 if d[lmax]<=1-s:
 break
 lmax-=1
 return np.clip((data-ht[1][lmin])/(ht[1][lmax]-ht[1][lmin]), 0,1)
#根据半径计算权重参数矩阵
g_para = {}
def getPara(radius = 5): 
 global g_para
    m = g_para.get(radius, None)
 if m is not None:
 return m
    size = radius*2+1
    m = np.zeros((size, size))
 for h in range(-radius, radius+1):
 for w in range(-radius, radius+1):
 if h==0 and w==0:
 continue
 m[radius+h, radius+w] = 1.0/math.sqrt(h**2+w**2)
    m /= m.sum()
 g_para[radius] = m
 return m
#常规的ACE实现
def zmIce(I, ratio=4, radius=300): 
    para = getPara(radius)
 height,width = I.shape
 #Python3报错如下 使用列表append修改
 zh = []
 zw = []
    n = 0
 while n < radius:
 zh.append(0)
 zw.append(0)
        n += 1
 for n in range(height):
 zh.append(n)
 for n in range(width):
 zw.append(n)
    n = 0
 while n < radius:
 zh.append(height-1)
 zw.append(width-1)
        n += 1
 #print(zh)
 #print(zw)
    Z = I[np.ix_(zh, zw)]
    res = np.zeros(I.shape)
 for h in range(radius*2+1):
 for w in range(radius*2+1):
 if para[h][w] == 0:
 continue
            res += (para[h][w] * np.clip((I-Z[h:h+height, w:w+width])*ratio, -1, 1))
 return res
#单通道ACE快速增强实现
def zmIceFast(I, ratio, radius):
 print(I)
    height, width = I.shape[:2]
 if min(height, width) <=2:
 return np.zeros(I.shape)+0.5
    Rs = cv2.resize(I, (int((width+1)/2), int((height+1)/2)))
    Rf = zmIceFast(Rs, ratio, radius) #递归调用
    Rf = cv2.resize(Rf, (width, height))
    Rs = cv2.resize(Rs, (width, height))
 return Rf+zmIce(I,ratio, radius)-zmIce(Rs,ratio,radius) 
#rgb三通道分别增强 ratio是对比度增强因子 radius是卷积模板半径 
def zmIceColor(I, ratio=4, radius=3): 
    res = np.zeros(I.shape)
 for k in range(3):
        res[:,:,k] = stretchImage(zmIceFast(I[:,:,k], ratio, radius))
 return res
#主函数
if __name__ == '__main__':
 img = cv2.imread('test01.png')
    res = zmIceColor(img/255.0)*255
    cv2.imwrite('Ice.jpg', res)

运行结果如图3和图4所示,ACE算法能有效进行图像去雾处理,实现图像的细节增强。

三.总结

本文主要讲解图像局部直方图均衡化和自动色彩均衡化处理。这些算法可以广泛应用于图像增强、图像去噪、图像去雾等领域。

 

点击关注,第一时间了解华为云新鲜技术~

与跟我学Python丨图像增强及运算:局部直方图均衡化和自动色彩均衡化处理相似的内容:

跟我学Python丨图像增强及运算:局部直方图均衡化和自动色彩均衡化处理

摘要:本文主要讲解图像局部直方图均衡化和自动色彩均衡化处理。这些算法可以广泛应用于图像增强、图像去噪、图像去雾等领域。 本文分享自华为云社区《[Python从零到壹] 五十四.图像增强及运算篇之局部直方图均衡化和自动色彩均衡化处理》,作者: eastmount。 一.局部直方图均衡化 前文通过调用O

跟我学Python图像处理丨图像分类原理与案例

摘要:本篇文章将分享图像分类原理,并介绍基于KNN、朴素贝叶斯算法的图像分类案例。 本文分享自华为云社区《[Python图像处理] 二十六.图像分类原理及基于KNN、朴素贝叶斯算法的图像分类案例丨【百变AI秀】》,作者:eastmount 。 一.图像分类 图像分类(Image Classifica

跟我学Python图像处理丨带你入门OpenGL

摘要:介绍Python和OpenGL的入门知识,包括安装、语法、基本图形绘制等。 本文分享自华为云社区《[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)》,作者:eastmount。 一.OpenGL入门知识 1.什么是OpenGL OpenGL(Open Graphics L

跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效

摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现。 本文分享自华为云社区《[Python图像处理] 二十四.图像特效处理之毛玻璃、浮雕和油漆特效》,作者:eastmount。 一.图像毛玻璃特效 图像毛玻璃特效如图所示,左边为原始图像,右边

跟女朋友介绍十个常用的 Python 内置函数,她夸了我一整天

内置函数是什么 了解内置函数之前,先来了解一下什么是函数 将使用频繁的代码段进行封装,并给它起一个名字,当我们使用的时候只需要知道名字就行 函数就是一段封装好的、可以重复使用的代码,函数使得我们的程序更加简洁、模块化,提高了代码的复用性 举个例子 我想实现一个求球表面积功能的程序,当我们知道半径 r

python进阶:带你学习实时目标跟踪

摘要:本程序主要实现了python的opencv人工智能视觉模块的目标跟踪功能。 本文分享自华为云社区《python进阶——人工智能实时目标跟踪,这一篇就够用了!》,作者:lqj_本人 。 前言 本程序主要实现了python的opencv人工智能视觉模块的目标跟踪功能。 项目介绍 区域性锁定目标实时

[转帖]Python-Mock接口测试

https://www.cnblogs.com/zhangwuxuan/p/12928850.html 前言 今天跟小伙伴们一起来学习一下如何编写Python脚本进行mock测试。 什么是mock? 测试桩,模拟被测对象的返回,用于测试 通常意义的mock指的就是mock server, 模拟服务端

python 星号(*) 还能这么用

哈喽大家好,我是咸鱼 今天跟大家介绍一下 python 当中星号(`*`)的一些用法 首先大家最常见的就是在 python 中 `*` 是乘法运算符,实现乘法 ```python sum = 5 * 5 # 25 ``` 除此之外,还有一种常见的用法就是 `*` 号操作符在函数中的用法 - 单星号(

深挖 Python 元组 pt.1

哈喽大家好,我是咸鱼 好久不见甚是想念,2023 年最后一次法定节假日已经结束了,不知道各位小伙伴是不是跟咸鱼一样今天就开始“搬砖”了呢? 我们知道元组(tuple)是 Python 的内置数据类型,tuple 是一个不可变的值序列 tuple 的元素可以是任何类型,一般用在存储异构数据(例如数据库

[转帖]Python基础之判断和循环(三)

https://www.jianshu.com/p/5a7552821c63 一、判断 关于判断,跟字面意思一样,就是判断某一个时刻应不应该做某件事; 语法: if 判断条件: 执行语句…… else: 执行语句…… 判断条件: <:小于 >:大于 ==:等于 !=:不等于 >=:大于等于 <=:小