直方图均衡化CImg实现
这篇博客是关于试用CImg库来实现灰度图和彩色图的直方图均衡化操作。感觉效果还不错,除了彩色图在均衡化时会有一定的色彩失真。



C++代码实现:
//
// hEqualization.hpp
// 直方图均衡化
//
// Created by Alala on 2017/3/20.
// Copyright © 2017年 Alala. All rights reserved.
// #ifndef hEqualization_h
#define hEqualization_h
#include<CImg.h> using namespace cimg_library; class hEqualization {
private:
CImg<unsigned char> image;
int x;
int y;
float totalPixel; public:
hEqualization();
hEqualization(CImg<unsigned char> img);
void setImage(CImg<unsigned char> img);
CImg<unsigned char> toGray();
void grayProcess();
void RGBProcess();
}; hEqualization::hEqualization() {
x = ;
y = ;
totalPixel = ;
}
hEqualization::hEqualization(CImg<unsigned char> img) {
image = img;
x = image.width();
y = image.height();
totalPixel = x * y;
}
void hEqualization::setImage(CImg<unsigned char> img) {
image = img;
x = image.width();
y = image.height();
totalPixel = x * y;
} CImg<unsigned char> hEqualization::toGray() {
CImg<unsigned char> gray = image;
cimg_forXY(image, x, y) {
int r = image(x, y, );
int g = image(x, y, );
int b = image(x, y, );
double temp = (r * 0.2126 + g * 0.7152 + b * 0.0722);
gray(x, y, ) = temp;
gray(x, y, ) = temp;
gray(x, y, ) = temp;
}
return gray;
}
void hEqualization::grayProcess() {
CImg<unsigned char> gray = toGray();
gray.display("gray");
float pixels[];
float probability[];
float newP[];
memset(&pixels, , *sizeof(float));
cimg_forXY(image, x, y) {
pixels[int(image(x, y, ))]++;
}
for(int i = ; i < ; i++) {
probability[i] = pixels[i] / totalPixel;
if(i == ) {
newP[i] = probability[i];
} else {
newP[i] = probability[i] + newP[i-];
}
}
cimg_forXY(image, x, y) {
int temp = gray(x, y, );
temp = int(newP[temp] * + 0.5);
gray(x, y, ) = temp;
gray(x, y, ) = temp;
gray(x, y, ) = temp;
}
gray.display("test");
}
void hEqualization::RGBProcess() {
float pixelsR[];
float pixelsG[];
float pixelsB[];
memset(&pixelsR, , *sizeof(float));
memset(&pixelsG, , *sizeof(float));
memset(&pixelsB, , *sizeof(float)); float probabilityR[];
float probabilityG[];
float probabilityB[]; float newPR[];
float newPG[];
float newPB[];
cimg_forXY(image, x, y) {
pixelsR[int(image(x, y, ))]++;
pixelsG[int(image(x, y, ))]++;
pixelsB[int(image(x, y, ))]++;
}
for(int i = ; i < ; i++) {
probabilityR[i] = pixelsR[i] / totalPixel;
probabilityG[i] = pixelsG[i] / totalPixel;
probabilityB[i] = pixelsB[i] / totalPixel;
if(i == ) {
newPR[i] = probabilityR[i];
newPG[i] = probabilityG[i];
newPB[i] = probabilityB[i];
} else {
newPR[i] = probabilityR[i] + newPR[i-];
newPG[i] = probabilityG[i] + newPG[i-];
newPB[i] = probabilityB[i] + newPB[i-];
}
}
CImg<unsigned char> color = image;
cimg_forXY(image, x, y) {
int tempR = image(x, y, );
int tempG = image(x, y, );
int tempB = image(x, y, );
tempR = int(newPR[tempR] * + 0.5);
tempG = int(newPG[tempG] * + 0.5);
tempB = int(newPB[tempB] * + 0.5);
color(x, y, ) = tempR;
color(x, y, ) = tempG;
color(x, y, ) = tempB;
}
color.display("color");
} #endif /* hEqualization_h */
直方图均衡化CImg实现的更多相关文章
- 图解直方图均衡化及其Python实现
在理解直方图均衡化的过程中,参考了一些书籍和博客,让人困惑的是,笔者对于直方图的理解还是停留在表面,并没有深入理解其内涵.因此,本文拟结合图片对直方图的概念进行阐述,并给出其Python实现,最后对她 ...
- MATLAB - 练习程序,直方图均衡化
直方图均衡化的作用是图像增强. 有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布. 第一个问题.均衡化过程中,必须要保证两个条件:①像素无论怎么映射, ...
- opencv直方图均衡化
#include <iostream> #include "highgui.h" #include "cv.h" #include "cx ...
- matlab 直方图均衡化
原理: 直方图均衡化首先是一种灰度级变换的方法: 原来的灰度范围[r0,rk]变换到[s0,sk]变换函数为:s=T(r); 为便于实现,可以用查找表(look-up table)的方式存储,即:原始 ...
- opencv 彩色图像亮度、对比度调节 直方图均衡化
直接上代码: #include <Windows.h> #include <iostream>// for stand I/O #include <string> ...
- 灰度图像--图像增强 直方图均衡化(Histogram equalization)
灰度图像--图像增强 直方图均衡化(Histogram equalization) 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些 ...
- OpenCV-Python教程(10、直方图均衡化)
相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV和NumP ...
- 数学之路-python计算实战(14)-机器视觉-图像增强(直方图均衡化)
我们来看一个灰度图像,让表示灰度出现的次数,这样图像中灰度为 的像素的出现概率是 是图像中全部的灰度数, 是图像中全部的像素数, 实际上是图像的直方图,归一化到 . 把 作为相应于 的累计概率 ...
- 直方图均衡化C++实现
直方图均衡化在图像增强方面有着很重要的应用.一些拍摄得到的图片,我们从其直方图可以看出,它的分布是集中于某些灰度区间,这导致人在视觉上感觉这张图的对比度不高.所以,对于这类图像,我们可以通过直方图均衡 ...
随机推荐
- maven 的 snapshot 和 release 的区别
release 是发行版,通常正式发布使用. snapshot 快照版本.在开发过程中,每提交一次修改,编译好响应的jar包,都会更新到仓库中,所有添加了这个jar包的依赖都会把远程仓库里的jar包更 ...
- Python中类的方法属性与方法属性的动态绑定
最近在学习python,纯粹是自己的兴趣爱好,然而并没有系统地看python编程书籍,觉得上面描述过于繁琐,在网站找了一些学习的网站,发现廖雪峰老师的网站上面的学习资源很不错,而且言简意赅,提取了一些 ...
- linux vi hjkl由来
很远原因来自历史 I was reading about vim the other day and found out why it used hjkl keys as arrow keys. Wh ...
- Git的安装使用和基本命令(一)
版本控制系统是每一个程序员的必备神器,我相信任何一个程序员都要用到版本控制系统,它的强大之处我就不作解释了,在这我将Git(分布式版本控制系统)的安装使用和基本的命令给初学者介绍一下(在linux系统 ...
- IOS百度地图之--->第二篇《大头针__简单使用及自定义》
呵呵!大家不要只看帖不回帖么,要不然我都没有积极性了. 第一步:创建一个用来呈现mapview的viewcontroller,不废话直接贴代码 BasicMapViewControlle ...
- WPF: 本地化(Localization) 实现
本文将讨论一种较为方便的本地化方法. 由于在项目中要实现本地化,所以在网上查找相关的解决方案.通过一系列调研,发现实现本地化的方法主要有以下三种: 通过编译项目以设置 x:Uid 并使用 LocBam ...
- java学习笔记 --- 方法
一.方法 (1)方法:就是完成特定功能的代码块. 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法. (2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 ...
- parentNode和parentElement区别
parentNode跟parentElement除了前者是w3c标准,后者只ie支持 当父节点的nodeType不是1,即不是element节点的话,它的parentElement就会是null 一般 ...
- C#关于AutoResetEvent的使用介绍(用AutoResetEvent实现同步)
前几天碰到一个线程的顺序执行的问题,就是一个异步线程往A接口发送一个数据请求.另外一个异步线程往B接口发送一个数据请求,当A和B都执行成功了,再往C接口发送一个请求.说真的,一直做BS项目,对线程了解 ...
- 第5章Zabbix自动化监控
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...