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

来源:互联网 发布:网络鲜花礼品网 编辑:程序博客网 时间:2024/05/18 03:14
// 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;//255X255uchar * 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;}

原创粉丝点击