【2017/3/21更新】
自己用了RGB -> HSI模型来进行直方图均衡化。
后面用了RGB-> Lab模型进行颜色转换。
测试样例:
原图:
直方图均衡化:
灰度图:
灰度图直方图均衡化:
原图:
直方图均衡化:
灰度图:
灰度图直方图均衡化:
实现代码:
理论上什么图片都可以运行成功了。
其实RGB->HSI->RGB的公式搜一下就有,实现数学公式就好,主要是对HSI中的I通道进行直方图均衡化,因为I代表亮度,理论上不会影响色彩,不容易失真。
其实代码应该写成一个 类 封装起来更好。
#include "CImg.h"
#include <iostream>
#include <cmath>
#define PI 3.141
using namespace std;
using namespace cimg_library;
CImg<float> toGrayScale(CImg<float> img) {
CImg<float> grayscaled = img;
cimg_forXY(img, x, y) {
int r = img(x, y, 0);
int g = img(x, y, 1);
int b = img(x, y, 2);
double newValue = (r * 0.2126 + g * 0.7152 + b * 0.0722);
grayscaled(x, y, 0) = newValue;
grayscaled(x, y, 1) = newValue;
grayscaled(x, y, 2) = newValue;
}
return grayscaled;
}
CImg<float> his_equalization(CImg<float> img_) {
float statistics[256];
float cumulative[256];
float probability[256];
int rows = img_._width;
int cols = img_._height;
for (int i = 0; i < 256; i++) {
statistics[i] = 0;
cumulative[i] = 0;
probability[i] = 0;
}
CImg<float > img = img_;
float totalpixels = rows * cols;
cimg_forXY(img, x, y) {
float r = img(x, y, 0);
float g = img_(x, y, 1);
float b = img_(x, y, 2);
float min = r;
if(min > g) min = g;
if(min > b) min = b;
float t1 = 0.5*((r-g)+(r-b));
float t2 = pow((r-g)*(r-g)+(r-b)*(g-b)+0.0000001, 0.5);
float angle = acos(t1/t2) * 180 / 3.14;
float h = 0;
if(b <= g)
h = angle / 360.0;
else
h = (360.0- angle) / 360.0;
float s =