图像指数、对数增强、直方图均衡化
1、图像对数增强
计算公式为:
NewPixel=255/log(255)*log(OldPixel)
考虑到log(0)为负无穷大,对于图像来说这毫无意义,因此修改上述公式为:
NewPixel=255/log(256)*log(OldPixel+1);
我们看下上述的公式的原理。根据增强前后的象素值的函数关系式,可得到输入和输出的关系曲线,如下图:
可见,输出始终大于输入,整个画面的亮度增大。
在photoshop中的曲线界面中调整曲线如上图后的效果于本例一样。
由于根据上述算式直接编制程序如下:
' ******************************************************************************************
'
' 函数名 : LogCalc
' 功能 : 对图像进行对数增强(整体变亮)
' 参数 : Bmp ------ Bitmap 待处理位图
' TimeElapse ------ Integer 处理所需的时间
' 返回值 : Boolean
' 作者 : laviewpbt
' 时间 : 2005-5-20 10:05
' 修改者 :
' 修改时间 :
'
' ******************************************************************************************
Public Shared Function LogCalc(ByVal Bmp As Bitmap, ByRef TimeElapse As Integer) As Boolean
TimeElapse = Environment.TickCount
Dim i, j, Stride, Temp As Integer, k As Single, BmpData() As Byte
ReadBitmap(Bmp, BmpData)
k = 255 / Log(256)
ReadBitmap(Bmp, BmpData)
Stride = (((Bmp.Width * 24) + 31) / 32) * 4
For i = 0 To Bmp.Height - 1
For j = 0 To Bmp.Width - 1
Temp = i * Stride + j * 3
BmpData(Temp) = k * Log(BmpData(Temp) + 1)
BmpData(Temp + 1) = k * Log(BmpData(Temp + 1) + 1)
BmpData(Temp + 2) = k * Log(BmpData(Temp + 2) + 1)
Next
Next
WriteBitmap(Bmp, BmpData)
TimeElapse = Environment.TickCount - TimeElapse
Return True
End Function
上述过程对于1024*768的图片大约需要150ms的时间。仔细分析会发现这个过程大部分的运算开销在log函数的计算中,而log函数中的参数BmpData(Temp) + 1的范围是[1,256],因此如果事先计算出这255个值的对数保存在一数组中,则利用查表法可以极大的提高速度。以下是修改后的代码:
Public Shared Function LogCalc(ByVal Bmp As Bitmap, ByRef TimeElapse As Integer) As Boolean
TimeElapse = Environment.TickCount
Dim i, j, Stride, Temp As Integer, k As Single, BmpData() As Byte
Dim TempLogValue(256) As Single
For i = 1 To 256
TempLogValue(i) = Log(i)
Next
ReadBitmap(Bmp, BmpData)
k = 255 / Log(256)
Stride = (((Bmp.Width * 24) + 31) / 32) * 4
For i = 0 To Bmp.Height - 1
For j = 0 To Bmp.Width - 1
Temp = i * Stride + j * 3
BmpData(Temp) = k * TempLogValue(BmpData(Temp) + 1)
BmpData(Temp + 1) = k * TempLogValue(BmpData(Temp + 1) + 1)
BmpData(Temp + 2) = k * TempLogValue(BmpData(Temp + 2) + 1)
Next
Next
WriteBitmap(Bmp, BmpData)
TimeElapse = Environment.TickCount - TimeElapse
Return True
End Function
对数增强效果图(整体变亮)
上述过程只需40ms左右。
(2006-6-1更改) 更改如下形式则更快:
Public Shared Function LogCalc(ByVal Bmp As Bitmap, ByRef TimeElapse As Integer) As Boolean
TimeElapse = Environment.TickCount
Dim i, j, Stride, Temp As Integer
Dim k As Single, TempLogValue(256) As Single
Dim BmpData() As Byte
k = 255 / Log(256)
For i = 0 To 255
TempLogValue(i) = k * Log(i + 1)
Next
ReadBitmap(Bmp, BmpData)
Stride = (((Bmp.Width * 24) + 31) / 32) * 4
For i = 0 To Bmp.Height - 1
For j = 0 To Bmp.Width - 1
Temp = i * Stride + j * 3
BmpData(Temp) = TempLogValue(BmpData(Temp))
BmpData(Temp + 1) = TempLogValue(BmpData(Temp + 1))
BmpData(Temp + 2) = TempLogValue(BmpData(Temp + 2))
Next
Next
WriteBitmap(Bmp, BmpData)
TimeElapse = Environment.TickCount - TimeElapse
Return True
End Function
2、图像的指数增强
指数运算的的计算公式为:
NewPixel=1/255*OldPixel*OldPixel
该关系的输入输出曲线如下图所示:
输出始终小于输入,即图像整体变暗。同样,在循环中也要避免大量重复OldPixel*OldPixel计算,因为OldPixel属于[0,255],优化后的代码如下:
' ******************************************************************************************
'
' 函数名 : ExpCalc
' 功能 : 对图像进行指数增强(整体变暗)
' 参数 : Bmp ------ Bitmap 待处理位图
' TimeElapse ------ Integer 处理所需的时间
' 返回值 : Boolean
' 作者 : laviewpbt
' 时间 : 2005-5-20 10:10
' 修改者 :
' 修改时间 :
'
' ******************************************************************************************
Public Shared Function ExpCalc(ByVal bmp As Bitmap, ByRef TimeElapse As Integer) As Boolean
TimeElapse = Environment.TickCount
Dim i, j, Stride, Temp As Integer, k As Single
Dim BmpData() As Byte
ReadBitmap(bmp, BmpData)
Dim TempPowerValue(255) As Single
For i = 0 To 255
TempPowerValue(i) = i ^ 2
Next
k = 1 / 255
Stride = (((bmp.Width * 24) + 31) / 32) * 4
For i = 0 To bmp.Height - 1
For j = 0 To bmp.Width - 1
Temp = i * Stride + j * 3
BmpData(Temp) = k * TempPowerValue(BmpData(Temp))
BmpData(Temp + 1) = k * TempPowerValue(BmpData(Temp + 1))
BmpData(Temp + 2) = k * TempPowerValue(BmpData(Temp + 2))
Next
Next
WriteBitmap(bmp, BmpData)
TimeElapse = Environment.TickCount - TimeElapse
Return True
End Function
计算时间大约为40ms.
(2006-6-1更改) 更改如下形式则更快:
Public Shared Function ExpCalc(ByVal bmp As Bitmap, ByRef TimeElapse As Integer) As Boolean
TimeElapse = Environment.TickCount
Dim i, j, Stride, Temp As Integer
Dim TempPowerValue(255) As Integer
Dim k As Single
Dim BmpData() As Byte
ReadBitmap(bmp, BmpData)
k = 1 / 255
For i = 0 To 255
TempPowerValue(i) = k * i ^ 2
Next
Stride = (((bmp.Width * 24) + 31) / 32) * 4
For i = 0 To bmp.Height - 1
For j = 0 To bmp.Width - 1
Temp = i * Stride + j * 3
BmpData(Temp) = TempPowerValue(BmpData(Temp))
BmpData(Temp + 1) = TempPowerValue(BmpData(Temp + 1))
BmpData(Temp + 2) = TempPowerValue(BmpData(Temp + 2))
Next
Next
WriteBitmap(bmp, BmpData)
TimeElapse = Environment.TickCount - TimeElapse
Return True
End Function
指数增强效果(整体便暗)
上述过程用时40ms左右。
3、直方图均衡化
直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。这里选用常用的增强函数:累计分布函数(cumulative distribution function,CDF)。
' ******************************************************************************************
'
' 函数名 : EqualizeCalc
' 功能 : 直方图均衡化
' 参数 : Bmp ------ Bitmap 待处理位图
' TimeElapse ------ Integer 处理所需的时间
' 返回值 : Boolean
' 作者 : laviewpbt
' 时间 : 2005-5-20 12:37
' 修改者 :
' 修改时间 :
'
' ******************************************************************************************
PublicSharedFunction EqualizeCalc(ByVal Bmp As Bitmap, ByRef TimeElapse AsInteger) AsBoolean
TimeElapse = Environment.TickCount
Dim i, j, Stride, Temp AsInteger
Dim BmpData() AsByte
ReadBitmap(Bmp, BmpData)
Stride = (((Bmp.Width * 24) + 31) / 32) * 4
Dim MidValue(2) AsInteger, NumOfPixel AsInteger
Dim Map(255, 2) AsByte
Dim Histgram(255, 2) AsInteger
NumOfPixel = Bmp.Width * Bmp.Height
'******************** 得到图像的灰度分布情况 *****************
For i = 0 To Bmp.Height - 1
For j = 0 To Bmp.Width - 1
Temp = i * Stride + j * 3
Histgram(BmpData(Temp), 0) += 1
Histgram(BmpData(Temp + 1), 1) += 1
Histgram(BmpData(Temp + 2), 2) += 1
Next
Next
'*********************** 计算灰度映射表 *********************
For i = 0 To 255
MidValue(0) = 0 : MidValue(1) = 0 : MidValue(2) = 0
For j = 0 To i
MidValue(0) += Histgram(j, 0)
MidValue(1) += Histgram(j, 1)
MidValue(2) += Histgram(j, 2)
Next
Map(i, 0) = MidValue(0) * 255 / NumOfPixel
Map(i, 1) = MidValue(1) * 255 / NumOfPixel
Map(i, 2) = MidValue(2) * 255 / NumOfPixel
Next
'************************** 更新图像数据 ***********************
For i = 0 To Bmp.Height - 1
For j = 0 To Bmp.Width - 1
Temp = i * Stride + j * 3
BmpData(Temp) = Map(BmpData(Temp), 0)
BmpData(Temp + 1) = Map(BmpData(Temp + 1), 1)
BmpData(Temp + 2) = Map(BmpData(Temp + 2), 2)
Next
Next
WriteBitmap(Bmp, BmpData)
TimeElapse = Environment.TickCount - TimeElapse
ReturnTrue
EndFunction
均衡化效果(用时70ms)
由上图可见,视觉效果并没有得到改善,反而差了,呵呵,这就要看你原始图片的质量了,因为我的图片质量本身是非常好的。还有一点,如果你对一副图片均衡化后在均衡则图像不会有任何变化了,这从其实现原理上可以很清楚的看到。
要注意的是,均衡化处理后的图象只能是近似均匀分布。均衡化图象的动态范围扩大了,但其本质是扩大了量化间隔,而量化级别反而减少了,因此,原来灰度不同的象素经处理后可能变的相同,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。如果原始图像对比度本来就很高,如果再均衡化则灰度调和,对比度降低。
图像指数、对数增强、直方图均衡化相关推荐
- 【图像处理】图像强度变换、直方图均衡化(Image Intensity Transformations and Histogram Equalization)
实验要求 该实验使用强度变换方法对图像进行增强.实验图像为图3.8(a) (1.a) 用公式(3.2-2)所示的对数变换方法进行图像增强. (1.b) 用公式(3.2-3)形式的指数变换方 ...
- Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)
Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization) ############ ...
- 直方图均衡 视觉显著_视觉图像:对比度受限直方图均衡化CLAHE
CLAHE源码解析: ContrastLimitAHE .h: #ifndef _CONTRAST_LIMIT_AHE_H_ #define _CONTRAST_LIMIT_AHE_H_ #inclu ...
- C#+Opencv图像处理01:16位影像转8位、单通道转三通道、彩色影像增强(直方图均衡化、对数变换和伽马变换)
目录 1 读取不同类型的影像 2 转化16位影像为8位影像 3 将单通道影像转化为多通道影像
- OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换
OpenCV与图像处理学习五--图像滤波与增强:线性.非线性滤波.直方图均衡化与Gamma变换 三.图像滤波与增强 3.1 线性滤波 3.1.1 方框滤波 3.1.2 均值滤波 3.1.3 高斯滤波 ...
- 基于python的对比度增强(线性变换、直方图正规化、直方图均衡化、CLAHE)
线性变换 假设输入图像为I,宽为W,高为H,输出图像为O,图像的线性变换可以用以下公式定义: O(r,c)=a×I(r,c)+b,0≤r<H,0≤c<WO(r, c) = a × I(r, ...
- 图像增强及直方图均衡化在图像去雾上的应用(附matlab代码)
一.图像增强技术介绍 简单进行一个背景介绍:图像增强就是将一幅图中需要的信息增强,消弱或去除不需要的信息的一种处理技术,可以达到改善图像质量的作用. 根据处理空间的不同,可以分为空域增强和频域增强两种 ...
- 【OpenCV 例程200篇】46. 直方图均衡化
[OpenCV 例程200篇]46. 直方图均衡化 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像直方图是反映图 ...
- Retinex、log对数变换、直方图均衡化区别,边缘增强Retinex算法与拉普拉斯算法联系、均衡化与亮度调节算法、大津阈值计算
1.其中Retinex算法具有的功能:动态范围压缩(即滤掉了低频部分,提取了高频).色调再现(即还有图像色彩):具有锐化.颜色恒常性.动态范围压缩大.色彩保真度高等特点. 从算法公式上的个人理 ...
最新文章
- Zookeeper和Redis实现分布式锁,附我的可靠性分析
- mysql语句大全 新浪博客_MySQL语句入门
- 前端学习(1969)vue之电商管理系统电商系统之渲染动态参数和静态参数的表格
- 数据结构一—— 数组
- 通过这个免费的,由23部分组成的互动课程,学习ES6 +
- Android数据存储------1,文件存储
- 一些sql语句的详细解释
- MySQL数据库的卸载
- R绘图笔记 | 生存曲线的绘制
- java查看jar包源代码_如何查看 JAR 包的源代码
- 不知道短视频很火的配音怎么制作?只需要看这一篇就够了
- Qt 之 QDateEdit 和 QTimeEdit
- Java String.contains()方法
- 微信小程序详解——小程序的生命周期和页面的生命周期
- typeof(undefined) == undefined 成立吗?
- Python JPG图片转DCM
- 2020-2-16 B - Math
- 51nod1326 遥远的旅途(spfa+dp)
- 一个Java初学者的体验
- 夜光带你走进python开发 (二十九)传奇语言