这篇博客是关于试用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实现的更多相关文章

  1. 图解直方图均衡化及其Python实现

    在理解直方图均衡化的过程中,参考了一些书籍和博客,让人困惑的是,笔者对于直方图的理解还是停留在表面,并没有深入理解其内涵.因此,本文拟结合图片对直方图的概念进行阐述,并给出其Python实现,最后对她 ...

  2. MATLAB - 练习程序,直方图均衡化

    直方图均衡化的作用是图像增强. 有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布. 第一个问题.均衡化过程中,必须要保证两个条件:①像素无论怎么映射, ...

  3. opencv直方图均衡化

    #include <iostream> #include "highgui.h" #include "cv.h" #include "cx ...

  4. matlab 直方图均衡化

    原理: 直方图均衡化首先是一种灰度级变换的方法: 原来的灰度范围[r0,rk]变换到[s0,sk]变换函数为:s=T(r); 为便于实现,可以用查找表(look-up table)的方式存储,即:原始 ...

  5. opencv 彩色图像亮度、对比度调节 直方图均衡化

    直接上代码: #include <Windows.h> #include <iostream>// for stand I/O #include <string> ...

  6. 灰度图像--图像增强 直方图均衡化(Histogram equalization)

    灰度图像--图像增强 直方图均衡化(Histogram equalization) 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些 ...

  7. OpenCV-Python教程(10、直方图均衡化)

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV和NumP ...

  8. 数学之路-python计算实战(14)-机器视觉-图像增强(直方图均衡化)

    我们来看一个灰度图像,让表示灰度出现的次数,这样图像中灰度为 的像素的出现概率是  是图像中全部的灰度数, 是图像中全部的像素数,  实际上是图像的直方图,归一化到 . 把  作为相应于  的累计概率 ...

  9. 直方图均衡化C++实现

    直方图均衡化在图像增强方面有着很重要的应用.一些拍摄得到的图片,我们从其直方图可以看出,它的分布是集中于某些灰度区间,这导致人在视觉上感觉这张图的对比度不高.所以,对于这类图像,我们可以通过直方图均衡 ...

随机推荐

  1. 手把手教你做个AR涂涂乐

    前段时间公司有一个AR涂涂乐的项目,虽然之前接触过AR也写过小Demo,但是没有完整开发过AR项目.不过经过1个多星期的学习,现在已经把项目相关的技术都学会了,在此向互联网上那些乐于分享的程序员前辈们 ...

  2. 关于binary log那些事——认真码了好长一篇

    本文介绍binlog的作用以及几个重要参数的使用方法,同时通过实验来描述binlog内部记录内容:row .statement跟mixed的设置下,记录了哪些东西,最后会简单介绍下binlog ser ...

  3. 微服务--webapi实现,脱离iis,脱离tomcat

    前言 微服务,顾名思义就是微小的单一的服务程序,单一流程,单一发布,开发和部署都可独立: 这是我的理解: 但基于web的服务,不管是webservice还是webapi等类似的服务都需要基于iis或者 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试>讲了不为和不能两个状态,针对不为,只能自己调整心态了,而对于不能,本文会结合一 ...

  5. 老李分享:QTP的录制原理以及实现

    老李分享:QTP的录制原理以及实现   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088 ...

  6. 老李分享:《Java Performance》笔记1——性能分析基础 1

    老李分享:<Java Performance>笔记1——性能分析基础   1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...

  7. body全屏

    html, body { min-height: 100%; }

  8. JAVA加密算法系列-AesCBC

    package ***; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.cryp ...

  9. 设计模式(四)—观察者模式

    一.概述      观察者模式类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你.其实,简单来讲就一句话:当 ...

  10. JavaWeb总结(八)—EL表达式

    一.EL表达式简介 EL全名Expression Language.主要有以下作用. 1.获取数据 EL表达式主要用于替换JSP页面的脚本表达式,以及各种类型的Web域中检索Java对象.获取数据.( ...