美文网首页色彩
自动色阶、对比度、直方图均衡等算法改进

自动色阶、对比度、直方图均衡等算法改进

作者: 图像算法 | 来源:发表于2019-08-20 09:27 被阅读0次

自动色阶

自动色阶就是自动定义每个通道中最亮和最暗的像素作为白和黑,然后按比例重新分配其间的像素值。

对比度

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就可容易地显示生动、丰富的色彩,当对比率高达300:1时,便可支持各阶的颜色。但对比率遭受和亮度相同的困境,现今尚无一套有效又公正的标准来衡量对比率,所以最好的辨识方式还是依靠使用者眼睛。

直方图均衡

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

自动色阶、自动对比度以及直方图均衡这三个算法虽然很普通,也很简单,但是在实际应用中有着非常高的使用率,特别是在修图中,很多设计师打开一幅图,首先的的操作就是Shift+Ctrl+L(自动色阶)。在原理实现上,他们都属于基于直方图统计方面的算法,执行效率都非常之高。

先来普及下调整图像- 自动对比度、自动色阶算法。

我们以24位彩色图像为例说明这两个算法。在执行两个算法之前,我们需要确定两个参数,大家在用PS时选择自动色阶并不会弹出什么参数设置对话框,那是因为PS把这个隐藏的比较深 。选择曲线或色阶命令,然后在弹出的界面中点击选项按钮,会出现如下界面

注意其中的裁剪(C)/裁剪(P)中的变量,这两个参数是影响自动色阶效果的重要数据,我们以变量LowCut和HighCut来记录它。好,接着说。两个算法的第一步,都是分别统计各通道(红/绿/蓝)的直方图。

看了上面代码,我很欣赏C++的++运算符,HistRed(Red)++,多么简单啊,而且更高效。

Dim HistRed(255) As Long, HistGreen(255) As Long

Dim HistBlue(255) As Long

For Y = 0 To Height - 1

Speed = Y * Stride

For X = 0 To Width - 1

Red = ImageData(Speed + 2): Green = ImageData(Speed + 1): Blue = ImageData(Speed)

HistRed(Red) = HistRed(Red) + 1 '统计直方图

HistGreen(Green) = HistGreen(Green) + 1

HistBlue(Blue) = HistBlue(Blue) + 1

Speed = Speed + 3

Next

Next

算法的第二步,分别计算各通道按照给定的参数所确定的上下限值。什么意思呢,比如对于蓝色通道,我们从色阶0开始向上累加统计直方图,当累加值大于LowCut*所有像素数时,以此时的色阶值计为MinBlue。然后从色阶255开始向下累计直方图,如果累加值大于HighCut*所有像素时,以此时的色阶值计为MaxBlue。

PixelAmount = Width * Height '所有像素的数目

Sum = 0

For Y = 0 To 255

Sum = Sum + HistBlue(Y)

If Sum >= PixelAmount * LowCut * 0.01 Then '注意PS界面里的那个百分号

MinBlue = Y '得到蓝色分量的下限

Exit For '退出循环

End If

Next

Sum = 0

For Y = 255 To 0 Step -1

Sum = Sum + HistBlue(Y)

If Sum >= PixelAmount * HighCut * 0.01 Then '注意PS界面里的那个百分号

MaxBlue = Y '得到蓝色分量的上限

Exit For '退出循环

End If

Next

绿色通道和红色通道的代码类似,请朋友们自己补充。

下一步,自动色阶和自动对比度就有所区别了,我们首先介绍自动色阶。

自动色阶:按照我们刚刚计算出的MinBlue/MaxBlue构建一个隐射表,隐射表的规则是,对于小于MinBlue的值,则隐射为0(实际上这句话也不对,隐射为多少是和那个自动颜色校正选项对话框中的阴影所设定的颜色有关,默认情况下是黑色,对应的RGB分量都为0,所以我们这里就隐射为0,有兴趣你们也可以指定为其他的参数),对于大于MaxBlue的值,则隐射为255(同理,这个值和高光的颜色设置有关),对于介于MinBlue和MaxBlue之间的值,则进行线性隐射,默认是隐射为0到255之间(当然实际是和我们的暗调和高光的设置有关,并且这里其实也不是线性隐射,是有一个Gamma校正,为了简便,用线性替代效果也没太大的问题)。

For Y = 0 To 255

If Y <= MinBlue Then

BlueMap(Y) = 0

ElseIf Y >= MaxBlue Then

BlueMap(Y) = 255

Else

BlueMap(Y) = (Y - MinBlue) / (MaxBlue - MinBlue) * 255 '线性隐射

End If

Next

顺便提一点,从程序的鲁棒性上来说,在执行这段代码前判断下MaxBlue是否等于MinBlue很有必要,两者相等,这图就无需校正了,直接结束程序。

用同样的道理,计算出绿色和红色通道的隐射表GreenMap和RedMap。

最后一步,对各通道图像数据进行隐射。

For Y = 0 To Height - 1

Speed = Y * Stride

For X = 0 To Width - 1

ImageData(Speed) = BlueMap(ImageData(Speed))

ImageData(Speed + 1) = GreenMap(ImageData(Speed + 1))

ImageData(Speed + 2) = RedMap(ImageData(Speed + 2))

Speed = Speed + 3

Next

Next

自动色阶完成,下面我们谈谈自动对比度的不同。

在计算完各通道对应的上下限值后,自动对比度算法首先获取三个通道下限值的最小值,以及上限值的最大值,如下代码:

If MinBlue < MinGreen Then

Min = MinBlue

Else

Min = MinGreen

End If

If Min > MinRed Then Min = MinRed

If MaxBlue > MaxGreen Then

Max = MaxBlue

Else

Max = MaxGreen

End If

If Max < MaxRed Then Max = MaxRed

然后以此为新的上下限,计算隐射表。

For Y = 0 To 255

If Y <= Min Then

Map(Y) = 0

ElseIf Y > Max Then

Map(Y) = 255

Else

Map(Y) = (Y - Min) / (Max - Min) * 255 '线性隐射

End If

Next

最后,以这个隐射表分别对红绿蓝通道进行处理。

For Y = 0 To Height - 1

Speed = Y * Stride

For X = 0 To Width - 1

ImageData(Speed) = Map(ImageData(Speed))

ImageData(Speed + 1) = Map(ImageData(Speed + 1))

ImageData(Speed + 2) = Map(ImageData(Speed + 2))

Speed = Speed + 3

Next

Next

有的时候我们发现自动色阶或对比度等等会过调整或欠调整,我们发现了对他们的一些改进方式,其核心改进如下:

for (int Y = 0; Y < 256; Y++)

{

if (Y < Min)

Table[Y] = 0;

else if (Y > Max)

Table[Y] = 255;

else

Table[Y] = IM_ClampToByte((float)(Y - Min) / (Max - Min) * 255);

}

改进后的方式:

float Avg = 0, Mean = 0, Sum = 0;

for (int Y = 0; Y < 256; Y++)

{

Sum += Histgram[Y];

Avg += Y * Histgram[Y];

}

Mean = Avg / Sum;

float Gamma = log(0.5f) / log((float)(Mean - Min) / (Max - Min));

if (Gamma < 0.1f)

Gamma = 0.1f;

else if (Gamma > 10)

Gamma = 10;

for (int Y = 0; Y < 256; Y++)

{

if (Y < Min)

Table[Y] = 0;

else if (Y > Max)

Table[Y] = 255;

else

Table[Y] = IM_ClampToByte(pow((float)(Y - Min) / (Max - Min), Gamma) * 255);

}

其中的Max和Min的意思请参考其他的文章。

改进后的查找表考虑到全图的一个平均值信息,根据这个平局值来决定调整的一个Gamma值,相当于他同时结合了Gamma校正和自动色阶的思想,普通的自动色阶对应Gamma=1,还是拿一些我常用的测试图举例吧。

似乎改进后的更为合理。

对于直方图均衡化的改进,核心原理:

改变图像的色调曲线。

它应该在图像的平坦区域中显示细节。

直方图均衡可以增强无意义的细节并隐藏重要但小巧的高对比度特征。这种方法使用了类似算法,但使用直方图值的平方根,因此其效果不太极端。

核心代码修改如下:

private void equalize(ImageProcessor ip, int[] histogram)

{

ip.resetRoi();

if (ip instanceof ShortProcessor) { // Short

max = 65535;

range = 65535;

} else { //bytes

max = 255;

range = 255;

}

double sum;

sum = getWeightedValue(histogram, 0);

for (int i=1; i<max; i++)

sum += 2 * getWeightedValue(histogram, i);

sum += getWeightedValue(histogram, max);

double scale = range/sum;

int[] lut = new int[range+1];

lut[0] = 0;

sum = getWeightedValue(histogram, 0);

for (int i=1; i<max; i++) {

double delta = getWeightedValue(histogram, i);

sum += delta;

lut[i] = (int)Math.round(sum*scale);

sum += delta;

}

lut[max] = max;

applyTable(ip, lut);

private double getWeightedValue(int[] histogram, int i) {

int h = histogram[i];

if (h<2 || classicEqualization) return (double)h;

return Math.sqrt((double)(h));

}

在这里,他主要打开直方图数据的根,这可以减少直方图对校正图像的一些特殊颜色等级的影响。他可以解决普通的直方图均衡,有时也可以处理图像变换。大问题,我们也用上面的两个数字来说明。

可以清楚地看出,标准直方图均衡对于两幅图像的处理来说太多了,并且改善的效果更加和谐自然。

这种改进也可以嵌入到许多其他直方图相关的算法中,例如CLAHE等,并且可以有效地改善它们的效果。

更多论文源码关注微信公众号:“图像算法”或者微信搜索账号imalg_cn关注公众号

相关文章

  • 自动色阶、对比度、直方图均衡等算法改进

    自动色阶 自动色阶就是自动定义每个通道中最亮和最暗的像素作为白和黑,然后按比例重新分配其间的像素值。 对比度 对比...

  • 一种强化的基于局部直方图裁剪均衡化的对比度调节算法。

    在很久前实现对比度受限的自适应直方图均衡化时,就曾经想过对该算法进行一定程度的扩展,之后使用自动对比度和自动色阶代...

  • ps学习笔记14色阶直方图

    色阶工具一般用于修改曝光不足的图像,增加亮度,增加对比度。 色阶直方图 所谓的色阶直方图,其实就是图像上明暗像素的...

  • 直方图均衡化

    直方图均衡化是图像算法中利用图像的直方图来调整原图像对比度的一种方法。首先还是介绍下算法的基本原理:直方图是对数据...

  • phostoshop-调色

    色阶(直方图) alt+鼠标移到取消 则会变成复位crtl+shift+L 自动色阶 (色阶自动拉开) 调整方式 ...

  • OpenCV-Python学习(十一):直方图

    目录: 1.绘制直方图1)一维直方图2)2D直方图 2.直方图均衡化1)全局直方图均衡化2)CLAHE(限制对比度...

  • #30天专注橙长计划#色阶

    色阶: 直方图:好的设计师能一眼看出直方图的问题 输入:修改前, 输出:修改后, 自动色阶:CTRL+SHIFT+...

  • python-opencv图像增强

    直方图均衡化 直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到...

  • 10、直方图应用

    直方图均衡化,实际上是调整图像的对比度,是图像增强的一种手段 (注:直方图均衡化都是基于灰度图像) 全局均衡化 局...

  • 低亮度图片增强方法:直方图均衡化

    直方图均衡化(HE) 直方图均衡化是最简单、最方便的低亮度图片增强的算法。 HE通过拉伸图片直方图的分布,使得图片...

网友评论

    本文标题:自动色阶、对比度、直方图均衡等算法改进

    本文链接:https://www.haomeiwen.com/subject/cilusctx.html