直方图均衡化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++实现
直方图均衡化在图像增强方面有着很重要的应用.一些拍摄得到的图片,我们从其直方图可以看出,它的分布是集中于某些灰度区间,这导致人在视觉上感觉这张图的对比度不高.所以,对于这类图像,我们可以通过直方图均衡 ...
随机推荐
- 用shell实现linux系统应用文件清理工具
用shell实现linux系统文件清理工具 1:原始需求 在系统运维中,会产生大量应用备份文件.落地文件等,这些文件需要定时清理.一般来说,都是使用crontab 拉起一个脚本来清理.类似这样: 30 ...
- JDBC(下)
1. 预编译sql处理(防止sql注入) -- 创建数据库 CREATE DATABASE jdbc_demo DEFAULT CHARACTER SET utf8;i -- 创建表 USE jdbc ...
- Dark的项链(树链剖分)
P2272 - Dark的锁链 Description 无向图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边.Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由 ...
- linux性能监控分析及通过nmon_analyse生成分析报表
nmon是一款分析 AIX 和 Linux 性能的免费工具 nmon 工具还可以将相同的数据捕获到一个文本文件,便于以后对报告进行分析和绘制图形.输出文件采用电子表格的格式 (.csv). 性能介绍 ...
- 解决Appium 抓取toast
首先我们先看看这个gif,图中需要,要抓取的字符串--->请输入转让份数 1.要导入java-client-5.0.0-SNAPSHOT.jar 包的地址:链接:http://pan.baidu ...
- 使用idea2017搭建SSM框架
搭建个SSM框架居然花费了我好长时间!特此记录! 需要准备的环境: idea 2017.1 jdk1.8 Maven 3.3.9 请提前将idea与Maven.jdk配置好,本次项目用的都是比较新的 ...
- go单元测试进阶篇
作者介绍:熊训德(英文名:Sundy),16年毕业于四川大学大学并加入腾讯.目前在腾讯云从事hadoop生态相关的云存储和计算等后台开发,喜欢并专注于研究大数据.虚拟化和人工智能等相关技术. 本文档说 ...
- 老李分享:webservice是什么?1
老李分享:webservice是什么? 前言 Web Services 是 Web 应用出于和其他 Web 应用以交互数据为目的的开放式标准(XML.SOAP.HTTP 等).Web Servic ...
- [转载]转载一篇好文章作为Java与面向对象之随感(3)
关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没法很 ...
- C#---------------继承和多态初步
继承:在程序中,如果一个类A:类B,这种机制就是继承. 子类可以继承父类的所有内容(成员)吗? 解析: 1.私有成员(属性和方法) 2.构造函数 3.final修饰过的方法,子类不能进行重写 3.访问 ...