摘要
我们日常生活中看到的图片,都是8位的,但是随着科技的进步,像医疗、红外线、高清航拍等领域需要更宽的量化分析范围,比如10位、12位、14位、16位的图片,甚至还有浮点型的。这些高清的图片让我们看到了更多美丽的世界。
正文
一般 大家日常生活碰到的图象,不论是jpg、或是png或是bmp格式,一般全是8位的(每一个安全通道的清晰度值范畴是0-255),可是伴随着一些硬件配置的发展趋势,在许多领域例如诊疗、红外线、高清航拍等一些情景下,有着更宽的量化分析范畴的图象也愈来愈普遍,例如10位(网络带宽1024)、12位(网络带宽4096)、14位(网络带宽16384)及其16位(网络带宽32768)的图象,自然也有以浮点型储存的高动态图像(hdr文件格式的那类),可是现阶段绝大多数的显示屏或是只适用8位图象的表明,因而,针对这一类图象,一个很重要的难题便是如何把她们的数据信息量化分析到0到255中间,并且尽可能的保存大量的关键点信息内容,这也就是普遍的HDR到LDR的全过程。 在我前边的blog里实际上 也有讲到这些方面的信息内容,文中再试着将条形图均衡引进到这一全过程中。
最先,大家统一一下由一组ushort数据信息(网络带宽是10、12、14、16的Raw图像,都能够用ushort基本数据类型表明)立即量化分析为8位表明的涵数,那样大家的解决就可以集中化在初始的ushort数据信息历经优化算法解决后获得新的ushort数据信息的全过程。这一涵数简易以下所显示:
// 这一仅仅个輔助用于表明的涵数
int IM_ConvetUshortToByte(unsigned short *Src, unsigned char *Dest, int Width, int Height, int Stride, int WindowWidth, int WindowLevel)
{
int Channel = Stride / Width;
int Min = WindowLevel - WindowWidth / 2;
int Max = WindowLevel WindowWidth / 2;
if (Min < 0) Min = 0;
if (Max > 65535) Max = 65535;
int Diff = Max - Min;
if (Diff == 0)
{
memset(Dest, Max, Height * Stride * sizeof(unsigned char));
}
else
{
unsigned char Table[65536];
for (int X = 0; X < 65536; X )
{
if (X < Min)
Table[X] = 0;
else if (X > Max)
Table[X] = 255;
else
Table[X] = IM_ClampToByte((X - Min) * 255 / Diff);
}
for (int Y = 0; Y < Height; Y )
{
unsigned short *LinePS = Src Y * Width * Channel;
unsigned char *LinePD = Dest Y * Stride;
for (int X = 0; X < Width * Channel; X )
{
LinePD[X] = Table[LinePS[X]];
}
}
}
return IM_STATUS_OK;
}
在其中的WindowWidth表明窗宽,WindowLevel表明窗位,这一实际上 是依靠了医药学图象上的一些定义,针对一般的RAW图象,例如12位,大家一般 就觉得WindowWidth = 1 << 12 = 4096,而WindowLevel则就为窗宽的一半。
一般来说,RAW图象中的数据信息每一行是沒有沉余量的,即沒有BMP位图文件中说白了的扫描仪行两端对齐的定义。因此能够 立即解析xml每一个数据信息。
那麼大家一起来看看怎样把一般的条形图均衡优化算法运用到RAW图象中。
以灰度图为例子,假如早已统计分析了图象的条形图,则条形图均衡的新的影射曲线图由下列编码获得:
for (int Y = 0, Num = 0; Y < 256; Y )
{
Num = Num Histgram[Y];
Table[Y] = (unsigned char)(((float)Num * 255) / (Width * Height)); // 留意(float)强制转换的部位,不然针对高清大图就外溢了,2014.11.1调整
}
简易的,拓展到ushort种类的RAW图象,大家还可以用下列的相近编码拿下:
for (int Y = 0, Num = 0; Y < WindowWidth; Y )
{
Num = Num Histgram[Y];
Table[Y] = (unsigned short)(((float)Num * WindowWidth) / (Width * Height)); // 留意(float)强制转换的部位,不然针对高清大图就外溢了,2014.11.1调整
}
有关这一WindowWidth,我认为一般能够 由二种方式获得,一个是大家早已知道这一硬件配置转化成的图象多少钱位的,普遍的就是10、12、14、16等,这个时候WindowWidth能够 立即特定,而假如仅有RAW数据信息,一种方法便是依据数据信息的最高值来明确WindowWidth,即取超过最高值的2的整数金额次幂的那一个值。
以下编码所显示:
ushort MaxValue = IM_GetMaxValue(ImageData, ImageWidth * ImageHeight * ImageChannel);
int ProperWindowWidth = 1;
while (ProperWindowWidth < MaxValue)
ProperWindowWidth *= 2;
WindowWidth = ProperWindowWidth;
WindowLevel = WindowWidth / 2;
这一简易的数据信息范畴的调节,大家看下一些实际效果:
a、RAW数据信息立即ConvetUshortToByte的8位結果图 b、条形图平衡后的RAW数据交换为8位的设计效果图 c、对8位的a图立即在条形图平衡后的結果图
根据较为能够 见到的确或是有显著的提高实际效果的,可是好像有过曝的状况。
我们可以模仿一种加强的根据部分条形图剪裁均衡的饱和度调整优化算法 或是限定饱和度响应式条形图均衡优化算法基本原理、完成及实际效果 原文中的方式将部分条形图均衡引进到16位中,试着看一下实际效果是不是有改进,这儿很少谈,只说下我碰到的好多个难题。
一个是在ClipHistogram 这一涵数的全过程中,大家发觉通常会发生这一涵数深陷无限循环的結果,特备是针对12位之上的图象,因而,这一很有可能必须 别的的一些改进措施。
二个是大家还能够学习培训【优化算法随记四】全自动色彩平衡、饱和度、条形图平衡等优化算法的一些小改善 一文中的getWeightedValue函数,即对获得的条形图数据信息开平方,具有一定的缩小功效,这一能够 显著的改进以上的曝出实际效果。
此外,一样的大道理,在部分优化算法里,还能够无需条形图均衡优化算法,能够 应用一切别的的根据条形图的调节数量,例如全自动色剂这些。
a、RAW数据信息立即ConvetUshortToByte的8位結果图 b、部分缩小条形图平衡后的RAW数据交换为8位的设计效果图
很显著那样解决后的实际效果好些许多。关键点、曝出这些都比较适合。
关于16位RAW图象,自己开发设计了一个简单的提高和程序处理,可在 https://files.cnblogs.com/files/Imageshop/Optimization_Demo_16.rar下载检测。
别的有关连接:
【16位RAW图象处理一】:根据Fast Bilateral Filtering 优化算法的 High-Dynamic Range(HDR) 图象光电技术。
【16位RAW图象处理二】:一种响应式多数投射的负色图象光电技术以及速率提升。
假如想時刻关心自己的热门文章,也可扫码关注:
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0