最基本的图像分析工具----灰度直方图。使用直方图辅助,可以实现4大灰度变换,包括线性灰度变换(灰度拉伸)、灰度对数变换、灰度伽马变换、灰度分段线性变换;使用直方图修正技术,可以实现2大变换,包括直方图均衡化和直方图规定化。

一、灰度直方图

灰度直方图分为一般灰度直方图和归一化灰度直方图,灰度直方图统计图像中各个灰度级出现的次数,而归一化的灰度直方图统计的是各个灰度级出现的频率。因此,灰度直方图通常在定量上,有总体像素个数以及各个灰度像素个数;在定性上,可以看出整体灰度动态范围,即对比度与亮度。

使用C#绘制一般灰度直方图的底层代码中,算法流程的核心是计算各个灰度级的像素个数;而绘制归一化灰度直方图,算法流程的核心是计算灰度即的累积分布函数。代码如下,然而代码在Halcon库中,可随意查看。

  byte* Init_byte = (byte*)bmpdata.Scan0;
//必须先对行遍历,再对列遍历
for (int i = ; i < bmpdata.Height; i++)
{
for (int j = ; j < bmpdata.Width; j++)
{
//计算出不同灰度级的像素个数
temp = *Init_byte;
CountPix[temp]++;
//换列
Init_byte++;
}
//换行
Init_byte += bmpdata.Stride - bmpdata.Width;
}
for (int k = ; k < ; k++)
{
//计算出不同灰度级的累积像素个数
if (k!=)
{
CumulatePix[k] = CumulatePix[k - ] + CountPix[k];
}
else
{
CumulatePix[] = CountPix[];
}
}

二、灰度的线性与非线性变换

灰度变换的目的在于增强图像的灰度对比度,达到理想预处理的目的。线性灰度变换,使用C#编码核心在于遍历图像的所有像素,对每个像素点添加一个乘性系数以及一个加性系数,调节两个参数以达到预想的效果(注意:对越界数值进行处理(0-255));非线性灰度变换,有对数变换与指数变换、伽马变换以及分段变换,编码实现同理,但区别在于实现了图像灰度的扩展和压缩功能,它会扩展低灰度值而压缩高灰度值,或者相反,让图像的灰度分布更加符合人的视觉特征或灰度对比度更强。在Halcon中,对应算子分别是scale_image、scale_image_max、log_image、exp_image、pow_image,分段变换则比较麻烦了,一般使用overpaint_region对图像中的region进行变换。因此,分段变换适合在底层实现。

  unsafe
{
byte* Init_byte = (byte*)mbpdata.Scan0;
for (int i = ; i < mbpdata.Width; i++)
{
for (int j = ; j < mbpdata.Height; j++)
{
value = k * (*Init_byte) + b;
//处理越界值
if (value>)
{
*Init_byte = ;
}
else if (value<)
{
*Init_byte = ;
}
else
{
*Init_byte = (byte)value;
} Init_byte++;
}
Init_byte += mbpdata.Stride - mbpdata.Width;
}
}

三、直方图均衡与直方图规定化

直方图均衡是以累积分布函数变换为基础的直方图修正法,可以产生灰度级为概率均匀分布的图像。主要用于增强动态范围偏小的图像,以提升灰度对比度。使用C#编码的核心算法流程,1.将灰度值进行归一化;2.将图像灰度设置概率均匀分布,即p=1。图像归一化就是将图像转换成唯一的标准形式以抵抗各种变换,并在此基础上进行灰度均匀分布。

因此,当原始图像的直方图不同而图像结构性内容相同时,直方图均衡化所得到的视觉上几乎是完全一致的。而后,学者相继提出自适应的直方图均衡化算法(AHE)以及对比度有限的自适应直方图均衡化(CLAHE)。而去雾算法的本质是对图像对比度和亮度的调节,因此,CLAHE广泛应用在去雾算法中。

在Halcon中,直方图均衡化只是一句代码的事,equ_histo_image。

   byte* Init_byte = (byte*)bmpdata.Scan0;
//必须先对行遍历,再对列遍历
for (int i = ; i < bmpdata.Height; i++)
{
for (int j = ; j < bmpdata.Width; j++)
{
//计算出不同灰度级的像素个数
temp = *Init_byte;
CountPix[temp]++;
Init_byte++;
}
Init_byte += bmpdata.Stride - bmpdata.Width;
}
for (int k = ; k < ; k++)
{
//计算出不同灰度级的累积像素个数
if (k!=)
{
CumulatePix[k] = CumulatePix[k - ] + CountPix[k];
}
else
{
CumulatePix[] = CountPix[];
}
//根据灰度值进行一对一映射,其中注意运算法顺序和括号,防止只出现整数0.
PixMap[k] = (byte)( *CumulatePix[k] / bytes+0.5);
}
byte* Init_byte2 = (byte*)bmpdata.Scan0;
for (int i = ; i < bmpdata.Height; i++)
{
for (int j = ; j < bmpdata.Width; j++)
{
//直方图均衡化,获取灰度级,对应映射
temp = *Init_byte2;
*Init_byte2=PixMap[temp];
Init_byte2++;
}
Init_byte += bmpdata.Stride - bmpdata.Width;
}

直方图均衡化不仅操作简单且有效地丰富灰度级,但这个过程是不受控制的,因此引出了直方图规定化,或称直方图匹配。直方图规定化本质上是一种拟合过程,因此使规定化图像在对比度以及亮度上具有类似标准图像的特性,这也正是直方图规定化的目的所在。直方图规定化的算法流程是建立在直方图均衡化之上的,统计累积分布概率的最小差值的位置,进行一一对应的映射。

      

图像的点运算----底层代码与Halcon库函数的更多相关文章

  1. 图像开发的p2s模式:halcon+opencv的联动

    [<zw版·Halcon与delphi系列原创教程> 图像开发的p2s模式:halcon+opencv的联动 尽管halcon功能强大,基本上cv只是halcon的一个子集,不过cv毕竟是 ...

  2. java中CRUD(增删查改)底层代码的实现

    java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...

  3. 底层代码创建GUI

    %底层代码创建GUI hf = figure(... 'Units','Normalized',... 'Color','w',... 'Position',[0.1 0.1 0.8 0.8]); h ...

  4. JAVAEE——BOS物流项目02:学习计划、动态添加选项卡、ztree、项目底层代码构建

    1 学习计划 1.jQuery easyUI中动态添加选项卡 2.jquery ztree插件使用 n 下载ztree n 基于标准json数据构造ztree n 基于简单json数据构造ztree( ...

  5. Java反射简单使用--第一次细致阅读底层代码

    1:所写的东西都经过验证,保证正确,环境jdk8,eclipse2:在例子中,尽量以生产环境中实际代码为例,那种固定值什么的没什么意义 问题: 1:想获取调用方法所需要的参数 2:参数是以json形式 ...

  6. ArrayList底层代码解析笔记

    通过底层代码可以学习到很多东西: public class ArrayList<E> extends AbstractList<E> implements List<E& ...

  7. Nova创建虚拟机的底层代码分析

    作为个人学习笔记分享.有不论什么问题欢迎交流! 在openstack中创建虚拟机的底层实现是nova使用了libvirt,代码在nova/virt/libvirt/driver.py. #image_ ...

  8. 图像旋转与图像缩放及Matlab代码实现

    本周的作业是自己通过公式编写图像旋转与缩放的代码.今天先通过调用函数的方法来实现. 图像的旋转: A=imread('2.jpg'); J=imrotate(A, 30); subplot(1,2,1 ...

  9. ceph 底层代码分享

    一.底层工作队列 二.对象操作 三.上下文(Context)代码分析:

随机推荐

  1. 2018.11-2019.1的随记|NOIP的考后随记

    就是日记吧?(这里就是写一些乱七八糟的东西qwq,当作自己的零散想念吧 1.24 今天跟着BLUESKY他们的视频一起领略了一下远在广州的CCF冬令营开幕式,看着ljh的拍的照片也体验了一下RM冬令营 ...

  2. Hbase的安装与测试

    实验环境 虚拟机伪分布式 Ubuntu 17.10 JDK 1.8 Hadoop 2.7.6 Hbase 1.3.3 ①安装和配置HBase. 首先从官网http://archive.apache.o ...

  3. 点击隐藏显示和点击body空白处隐藏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. “全栈2019”Java第五十七章:多态与构造方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. Servlet实现禁用cookie重写URL获取session

    前言 一个女人让他的程序员丈夫去商店买东西:你去附近的商店买些鸡蛋,如果有香蕉的话,买8个回来,这个丈夫买了8个鸡蛋回来,他的妻子大吃一惊:你为什么买了8个鸡蛋?! 程序员丈夫回答:因为他们有香蕉. ...

  6. [ActionScript 3.0] flash中的颜色

    在 Flash 中,颜色就是一串特殊的数字,一个颜色值可以是0到16,777,215中的任意数值,这就是24位(bit)色彩.也许大家会问,为什么有16,777,216(256*256*256)种颜色 ...

  7. UItextfield各个通知和回调的顺序

    成为第一响应者之前,调用delegate的textFieldShouldBeginEditing(_:)方法 成为第一响应者 发送通知UIKeyboardWillShow和UIKeyboardDidS ...

  8. windows下webpack不是内部命令 解决方法

    安装webpack 到打包文件一路出现的各种问题 windows下webpack不是内部命令 安装完webpack后要加下环境变量 系统变量新建 NODE_PATH 变量值E:\demo\webpac ...

  9. 移动端尺寸新写法-rem

    rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...

  10. BZOJ - 3263 三维偏序

    题意:定义元素为有序组(a,b,c),若存在x组(a_i,b_i,c_i)分别小于等于(a,b,c),则该元素的等级为x,求[0,n-1]等级的个数 cdq分治练手题,对a简单排序并去重,对b进行分治 ...