科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VB图像处理之图像的色彩纠正

VB图像处理之图像的色彩纠正

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文讲述用灰度直方图均衡来调整图像的色彩空间的方法

作者:WallesCai 来源:CSDN 2007年10月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
首先,我们需要获取要处理的图片中所有像素的色彩分布统计,也就是上面的几个通道所作那样。

  假设有一张图(我们直接用灰度来表示):

100 50 20
20 40 50
100 250 200

  统计入下:

20:2
40:1
50:2
100:2
200:1
250:1

  这张图一共有9个像素,我们用比例来表示每种颜色的出现比例:

20:2 / 9
40:1 / 9
50:2 / 9
100:2 / 9
200:1 / 9
250:1 / 9

  由于所有的色彩出现的次数不可能超过图片的总像素,因此,将所有色彩的比例相加也不会超过1(大家已经可以看出正好是1)

  最后我们按照从低到高的顺序,把各个色彩的比例进行加权统计,也就是当前点的“权”等于该点的原有比例加上前一个点的“权”,我们得到一个新的统计表:

20:2 / 9
40:3 / 9
50:5 / 9
100:7 / 9
200:8 / 9
250:9 / 9

  最后,根据这个新的统计表,我们来把像素的亮度用一个新的亮度来代替,算法为:

  新亮度=该点“权”×255

20:2 / 9 >> 20 (第一点不动,依然用20)
40:3 / 9×255=85
50:5 / 9×255=141
100:7 / 9×255=198
200:8 / 9×255=226
250:9 / 9×255=255

  这时我们得到了新的图:

100 50 20 198 141 20
20 40 50 >> 10 85 141
100 250 200 198 255 226

  原图中相对出现频率多的部分的宽度变大了。而出现较少的部分则变窄了。

  所以,灰度直方图均衡的作用就是把一张图片上出现多的色彩拓展,而把出现少的色彩压缩。

  从而得到了更“均衡”的色彩分布。

  下面附上我的例程:

Private Type ColorChart
 ColorCount(255) As Long '统计原来图片中的亮度出现次数
 PixcelCount As Long '记录图片的像素个数
 ColRatio(255) As Single '记录每一个亮度的出现比例
 NewVal(255) As Byte '存放新的亮度索引
End Type

Dim ColChart As ColorChart

Public Sub StatisticsChart()
 Dim R As Byte
 Dim G As Byte
 Dim B As Byte
 Dim Gray As Integer
 Dim X As Long
 Dim Y As Long
 Dim I As Long
 Dim L As Long
 Dim M As Long
 Dim C As Double
 On Error GoTo ErrLine

 Done = False
 TimeFilter = timeGetTime
 With ColChart
  For X = 0 To 255 '先把数组清零
   .ColorCount(X) = 0
  Next
  For X = 0 To OutPutWid '这两个循环用来扫描图片数据,记录每个点的灰度和出现次数
   For Y = 0 To OutPutHei
    R = ColVal(2, X, Y)
    G = ColVal(1, X, Y)
    B = ColVal(0, X, Y)
    Gray = R * 3 + G * 6 + B
    Gray = Gray \ 10
    .ColorCount(Gray) = .ColorCount(Gray) + 1
   Next
  Next

  .PixcelCount = X * Y '获得图片的像素总量
  C = 1 / .PixcelCount

  .ColRatio( 0) = .ColorCount(M, 0) * C '计算每个亮度的出现比例
  .NewVal( 0) = 0 '色值最小的色彩总是为0,不参与计算
  L = 0
  For I = 1 To 255
   .ColRatio(I) = .ColorCount( I) * C + .ColRatio( L) '进行加权
   .NewVal(I) = .ColRatio( I) * 255 '计算新的颜色索引
   L = L + 1
  Next

  For X = 0 To OutPutWid
   For Y = 0 To OutPutHei
    R = Colval(2, X, Y) '读取原来点的颜色
    G = Colval(1, X, Y)
    B = Colval(0, X, Y)
    R = .NewVal( R) '查表得到新的颜色
    G = .NewVal( G)
    B = .NewVal( B)
    ColOut(2, X, Y) = R '把新的颜色放到输出数组中
    ColOut(1, X, Y) = G
    ColOut(0, X, Y) = B
   Next
  Next
 End With

 Done = True
 TimeFilter = timeGetTime - TimeFilter
 Exit Sub
ErrLine:
 Done = True
 MsgBox Err.Description
End Sub

  如果读者对这个过程中的一些数组和变量不清楚,请参考我前面的几篇文章,其中有详细说明:

  VB图像处理之像素的获取和输出

  VB图像处理之二次线性插值的应用

  VB图像处理之几个常用滤镜的实现

  VB图像处理之铅笔画算法和木雕算法

  下一篇将继续为大家讲述颜色对比度和亮度的调节算法,以及彩色图片转换到灰度图片的算法。

  不要以为这个很简单,中间还是有一些小问题要注意的哦。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章