VC++编程实现对曝光不足照片的修复

引言

一般来说,照相产生缺陷的原因主要有对焦不准、光圈选择不合适以及暴光不足等几种情况,前两种情况的偶然性较强,而曝光不足虽也具有一定的偶然性但对于某些特殊情况比如暗中侦察等不方便使用闪光灯的场合则较为普遍。因此,有必要对曝光不足的照片提出一种比较通用的照片修复处理方法。

修复方法的设计

根据照相的一般原理:物体反射的光线经过透镜投影到胶片上,胶片上的感光颗粒根据光线的强弱做出不同程度的分解从而显现出不同的颜色。当没有使用闪光灯或暴光时间过短而造成照片曝光不足时,照射在胶片上的光线强度不够或照射时间过短均会使感光颗粒分解不完全,冲洗出来的照片就会发暗,下图便是一幅实际的曝光不足照片,可以看出整幅照片很昏暗,除了位于左下的三、四个大字隐约可见外,几乎看不出该照片到底拍了些什么。

虽然感光颗粒由于曝光不足而使照片显地昏暗,但由于同一胶片上的感光颗粒的感光程度仍是同真实物体所反射光线成比例的,因此在胶片上实际仍保存了真实物体的大部分信息,只是由于曝光不足造成的分解不完全使冲洗出的照片灰度分布过于集中,并超出了人眼对灰度级的分辨程度,才造成了视觉上的不可见。通过程序对照片做灰度分布统计(如下图所示)也可以看出照片的灰度分布主要集中在0 ~ 100之内,这显然是很暗的了。

基于以上几点认识,在进行照片修复时只要将过于集中的灰度分布按照一定的规则将其均匀分布于整个灰度区间即可在视觉上得到相当程度的改善。在这方面的处理方法中,灰度均衡化和灰度规定化(含单映射和组映射两种规则)应用较为广泛,但后者需要根据图象的不同人为规定好适当的预期灰度分布规则才能得到满意的效果,如果预期灰度分布规定不当则处理效果会很差,因此后者的通用性不好。而前者在处理时则只需要将当前的灰度分布均衡的分布于整个灰度区间即可,虽然对于某一幅特定的图象处理效果可能不及灰度规定化,但通用性却要好的多,对任意的图象均可获得相当不错的处理效果。

灰度均衡化处理算法

灰度均衡化处理对图像的增强过程可用增强函数t = EH(s)来表示,其中t和s分别表示目标图象和原始图象上的像素点(x,y),在进行均衡化处理时对增强函数EH需要满足两个条件:增强函数EH(s)在0≤s≤255的范围内是一个单调递增函数,这个条件保证了在增强处理时没有打乱原始图像的灰度排列次序。另一个需要满足的条件是对于0≤s≤255应当有0≤EH(s)≤255,它保证了变换过程灰度值的动态范围的一致。同样的,对于反变换过程s=EH-1(t),在0≤t≤1时也必须满足上述两个条件。累计分布函数(cumulative distribution function,CDF)即是满足上述条件的一种,通过该函数可以完成s到t 的均匀分布转换。此时的增强转换方程为:

tk = EH(sk) = (ni/n) = ps(si) ,(k=0,1,2,……,255)

上述求和区间为0到k,根据该方程可以由源图像的各像素灰度值直接得到直方图均衡化后各像素的灰度值。在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并计算出原始直方图分布,然后根据计算出的累计直方图分布tk按式tk=[(N-1)* tk+0.5]对其取整并得出源灰度sk到tk的灰度映射关系,其中N为灰度的级数。在重复上述步骤得到所有的源图像各灰度级到目标图像各灰度级的映射关系后按照新的映射关系对源图像各点像素进行灰度转换即可完成对源图的直方图均衡化。

时间: 2024-09-15 12:08:44

VC++编程实现对曝光不足照片的修复的相关文章

PS快速修复曝光不足照片的两种方法

  Photoshop主要处理以像素所构成的数字图像.使用其众多的编修与绘图工具,可以更有效的进行图片编辑工作.有时候我们拍的照片会产生曝光不足的现象,使整张图片有些发暗.今天就给脚本之家的朋友们介绍一个使用PS CC快速修复曝光不足照片的两种方法,挺简单的,也很实用.推荐一下和三联的朋友们一起分享学习吧! 修复的方法很多,下面介绍两种快速的处理方法: 第一种方法: 一.打开原图,按Ctrl + J 复制一层,执行:图像→自动色调.大家可以试试"自动对比度"或"自动颜色&qu

photoshop对严重曝光不足的照片进行修复

  photoshop对严重曝光不足的照片进行修复,让黑的看不清的照片起死回生,操作起来其实很简单的,遇到这种情况可以自己试试 分类: PS图片处理

C++/VC++编程的疑难问题及解答

本人在用C++/VC++编程时,遇到的一些比较难以解决的问题,在经过百思得其解之后,总结了一些解决方法,希望这些经验之谈能对大家有所帮助. 1.[VC问题] 编辑框内的换行? 答:假设要在编辑框内输出"12345\n6789".首先要设置编辑框的Multiline属性为TRUE,在输出时,除了要加\n,还要有\r.也就是说,如果要12345和6789在两行显示,需要输出12345\r\n6789.代码如下: m_strData = "12345\r\n67890";

PS怎么调整偏暗逆光照片的修复及润色

PS怎么调整偏暗逆光照片的修复及润色   最终效果 1.步骤分解图 2.按Ctrl+O组合键,打开这张原片 3.新建"组1"图层组,用来管理调色图层.创建一个"曲线"调整图层,然后将RGB曲线向上调节,提高画面的整体亮度

vc++-VC编程中提取源程序代码应用另一个程序

问题描述 VC编程中提取源程序代码应用另一个程序 请问各位大神,现在我有一段VC二维码识别程序的源代码,如何将其提取并编译成一个新的程序,满足从指定位置访问图片文件,输出识别信息?求指导. 在VC编程环境下实现,谢谢! 解决方案 既然有源代码,那么你要做的就是程序得到输入文件路径,然后传给源码中的函数对应参数,获取函数返回结果,进行处理. 解决方案二: 参考:http://blog.csdn.net/liuyu60305002/article/details/8713399 解决方案三: 有一段

vc++-VC++编程中HICON,这个是图标句柄,想这种带H的都是引用对象的地址的,是吗??

问题描述 VC++编程中HICON,这个是图标句柄,想这种带H的都是引用对象的地址的,是吗?? VC++编程中HICON,这个是图标句柄,想这种带H的**都**是引用对象的地址的,是吗??不会引用其他的吧,句柄只是引用对象的地址吧? 解决方案 局柄的数据结构并没有公开. Windows程序一书中的理解:句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引.因为windows的内存管理经常会将当前空闲对象的内存释放掉,当需要时访问再重新提交到物理

vc 编程老是出现error

问题描述 vc 编程老是出现error #include ""stdafx.h""#include ""math.h"" int main(int argc char* argv[]){ double abcx1x2mtemp; scanf(""%lf %lf %lf""&a&b&c); m=b*b-4*a*c; x1=(sqrt(m)-b)/(2*a); x2=

vc++-关于vc编程的小问题:怎么启动程序之前弹出列表框让用户选择

问题描述 关于vc编程的小问题:怎么启动程序之前弹出列表框让用户选择 如图,想实现的功能是,在启动程序时先弹出窗口让用户进行选择(列表框),待用户做出选择以后再进入响应的程序界面,请问怎么实现启动时先弹出这样一个列表框,看别人的程序没发现什么关于列表框的资源啊,.. 解决方案 就你贴出的这个界面,是MFC自带的.只要你定义了2种或者以上的DocumentTemplete,自然就会出现这个选择框. 解决方案二: http://dev.yesky.com/398/2341898_2.shtmlhtt

vc-利用VC++编程实现求直线与圆的交点。

问题描述 利用VC++编程实现求直线与圆的交点. 要求:(1) 利用对话框绘制直线,对话框中输入直线两端点的坐标. (2)利用对话框绘制圆,对话框中输入圆的圆心与半径. (3)绘制直线与圆得采用第3章的图形生成算法实现. (4)若直线与圆没有交点,在屏幕上打印"该直线与圆相离". (5)若直线与圆只有一个交点,在屏幕上打印"该直线与圆相切",并以相切点为圆心半径为5绘制红色的圆. (6)若直线与圆有两个交点,在屏幕上打印"该直线与圆相交",并以交