光线补足 直方图均衡化 弧形灰度拉伸

// Recolightcolor.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <cv.h>
#include <highgui.h>
#include <math.h>
using namespace std;
//单能道均衡化
void GrayHisEqualization(IplImage * grayimage)
{
	int His[256];
	double P[256];
	double C[256];
	int i,x,y;
	for(i = 0;i < 256; i++)
	{
		His[i] = 0;
		C[i] = P[i] = 0.0;
	}
	uchar * p = NULL;
	double totalpos = grayimage->width * grayimage->height;
	for(y = 0;y < grayimage->height; y++)
			for(x = 0;x < grayimage->width; x++)
			{
				p = (uchar *) (grayimage->imageData + y*grayimage->widthStep + x*grayimage->nChannels);
				His[(int)(*p)]++;
			}
	C[0] = His[0] / totalpos;
	for(i = 1;i < 256; i++)
	{
	    P[i] = His[i] / totalpos;
		C[i] = C[i-1] + P[i];
	}
		int a;
		for(y = 0;y < grayimage->height; y++)
			for(x = 0;x < grayimage->width; x++)
			{
				p = (uchar *) (grayimage->imageData + y*grayimage->widthStep + x*grayimage->nChannels);
				a = C[*p] * 255;
				if(a > 255)
				{
					a = 255;
				}
				*p = a;
			}

}
//对三通道图像直方图均衡化
IplImage * ImageHisEqualization(IplImage * image)
{
	IplImage * dstimage = cvCreateImage(cvGetSize(image),image->depth,image->nChannels);
	IplImage * bimage = cvCreateImage(cvGetSize(image),image->depth,1);
	IplImage * gimage = cvCreateImage(cvGetSize(image),image->depth,1);
	IplImage * rimage = cvCreateImage(cvGetSize(image),image->depth,1);
	
	cvSplit(image,bimage,gimage,rimage,0);//分离通道
	GrayHisEqualization(bimage);
	GrayHisEqualization(gimage);
	GrayHisEqualization(rimage);

	cvMerge(bimage,gimage,rimage,0,dstimage);//合并图像

	return dstimage;
}
//对灰度图光线补足
void GrayRayCompensate(IplImage * grayimage)
{
	int His[256];
	int i,x,y;
	for(i = 0;i < 256; i++)
	{
		His[i] = 0;
	}
	uchar * p = 0;
	for(y = 0;y < grayimage->height; y++)
		for(x = 0;x < grayimage->width; x++)
		{
			p = (uchar *) (grayimage->imageData + y*grayimage->widthStep + x*grayimage->nChannels);
			His[(int)(*p)]++;
		}
	int totalpos = (int) (grayimage->height*grayimage->width*0.20);	//选最亮的10%为补足标准
	int sum = 0;
	int vpos = 0;
	for(i = 255;i >= 0;i--)
	{
		if(sum < totalpos)
		{
			sum += His[i];
			vpos += (i * His[i]);
		}
	}
	
	vpos = vpos / sum;
	double time =  (255.0/(double)vpos);	//线性放大系数
	int a = 0;
	for(y = 0;y < grayimage->height; y++)
		for(x = 0;x < grayimage->width; x++)
		{
			p = (uchar *) (grayimage->imageData + y*grayimage->widthStep + x*grayimage->nChannels);
			a = (int)(p[0] * time);
			if(a > 255)
				*p = 255;
			else
				*p = a;
		}
}
//对 三通道图像作光线补偿
IplImage * ImageRayCompensate(IplImage * image)
{
	IplImage * dstimage = cvCreateImage(cvGetSize(image),image->depth,image->nChannels);
	IplImage * bimage = cvCreateImage(cvGetSize(image),image->depth,1);
	IplImage * gimage = cvCreateImage(cvGetSize(image),image->depth,1);
	IplImage * rimage = cvCreateImage(cvGetSize(image),image->depth,1);
	
	cvSplit(image,bimage,gimage,rimage,0);//分离通道
	GrayRayCompensate(bimage);
	GrayRayCompensate(gimage);
	GrayRayCompensate(rimage);

	cvMerge(bimage,gimage,rimage,0,dstimage);//合并图像

	return dstimage;
}
//对灰度图弧形增强
void GrayR(IplImage * grayimage)
{
	int x,y;
	int a = 0;
	int r = 65025;//255X255
	uchar * p;
	for(y = 0;y < grayimage->height; y++)
		for(x = 0;x < grayimage->width; x++)
		{
			p = (uchar *) (grayimage->imageData + y*grayimage->widthStep + x*grayimage->nChannels);
			a = p[0] ;
			a = r-(a-255)*(a-255);
			
			a = sqrt((double) a);
			
			if(a > 255)
				*p = 255;
			else
				*p = a;
		}
}
//对 三通道图像弧形增强
IplImage * ImageR(IplImage * image)
{
	IplImage * dstimage = cvCreateImage(cvGetSize(image),image->depth,image->nChannels);
	IplImage * bimage = cvCreateImage(cvGetSize(image),image->depth,1);
	IplImage * gimage = cvCreateImage(cvGetSize(image),image->depth,1);
	IplImage * rimage = cvCreateImage(cvGetSize(image),image->depth,1);
	
	cvSplit(image,bimage,gimage,rimage,0);//分离通道
	GrayR(bimage);
	GrayR(gimage);
	GrayR(rimage);

	cvMerge(bimage,gimage,rimage,0,dstimage);//合并图像

	return dstimage;
}

int main()
{
	const char * imagename = "G:\\360data\\重要数据\\桌面\\常用标准图\\暗.jpg";
	IplImage * image = cvLoadImage(imagename,1);
	//IplImage * image1 = ImageHisEqualization(image);//直方图均衡化
	//IplImage * image1 = ImageRayCompensate(image); //图像光线补足
	IplImage * image1 = ImageR(image);  //弧形增强
	IplImage * image2 = ImageHisEqualization(image1);//直方图均衡化
	cvNamedWindow("old",1);
	cvNamedWindow("compensate",1);
	cvNamedWindow("2",1);
	cvShowImage("2",image2);
	cvShowImage("old",image);
	cvShowImage("compensate",image1);
	cvSaveImage("HisEqualization.jpg",image1,0);
	cvSaveImage("HisEqualization1.jpg",image2,0);
	cvWaitKey();
	cvReleaseImage(&image);
	cvReleaseImage(&image1);
	cvDestroyAllWindows();

	return 1;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值