*********1.Histogram equalization************
(1)直方图均衡化的目的:经过转换i->c(i)使成绩为75分(a%)的学生成绩优于3/4(a%)的学生;
根据定义可得到的式子,对于全灰度区间的均衡化来说
c(i)/I=sum{n=0:i}(h(n))/N;
其中I为像素灰度值的最大值,N为图像中像素的总数,
右边sum{n=0:i}(h(n))称为累计分布函数,表示像素灰度值小于i的所有的像素点的个数;
n为像素值,取值为0~n;
当我们对某一特定的灰度区间进行均质化时,应有
c(i)/(Imax-Imin)=sum{n=Imin:i}(h(n))/N;
其中N为该区间内的象素点总数;
(2)在opencv中可以用对hsv图像的v亮度矩阵进行均衡化:
H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系
a.转化为HSV体系的图像cvtColor
b.split出Volume分量矩阵
c.对volume进行均衡化equalizeHist()
d.merge函数将三个单通道合并为一个三通道图像
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat img = imread("lena.jpg");//load the image
Mat img_hsv;
Mat img_H;
cvtColor(img, img_hsv, CV_BGR2HSV);//convert the image from RGB to HSV
imshow("img_hsv", img_hsv);
Mat img_hsv_v[3];
split(img_hsv,img_hsv_v);//split the image to a single-channel image to get the mat of V(volume)
imshow("img_hsv_v", img_hsv_v[2]);
equalizeHist(img_hsv_v[2], img_hsv_v[2]);
imshow("img_hsv_v_1", img_hsv_v[2]);
merge(img_hsv_v, 3,img_hsv);//merge the 3 single-channel images into a 3-channels image
imshow("img_hsv_1", img_hsv);
waitKey();
}
#include "stdafx.h"
#include
#include
using namespace cv;
int main()
{
Mat img = imread("lena.jpg");
Mat img_hsv;
Mat img_H;
cvtColor(img, img_hsv, CV_BGR2HSV);
imshow("img_hsv", img_hsv);
Mat img_hsv_v[3];
split(img_hsv,img_hsv_v);
imshow("img_hsv_v", img_hsv_v[2]);
equalizeHist(img_hsv_v[2], img_hsv_v[2]);
imshow("img_hsv_v_1", img_hsv_v[2]);
merge(img_hsv_v, 3,img_hsv);
imshow("img_hsv_1", img_hsv);
waitKey();
}
****************opencv**************************
改版后的opencv更加像matlab
1.Mat img=imread(Name_Path);
Mat img_new;Mat支持可变大小矩阵的声明而不需要对矩阵 进行赋值;
区别于Mat img_new=img;Mat img_new(img);
这两种方法得到的img_new是img的引用,对新矩阵的操作会改变img的值
2.imshow("title",Mat);
3.之前的带有cv开头的函数基本都去掉了cv,cv开头的表示是原有函数,是基于c的,在c++中运行会抱错
例如:cvtColor();split();merge();