图像直方图均衡化增强opencv与C语言版

本文实现彩色图像的全局直方图均衡。分别对R/G/B三通道均衡,读写图片采用OpenCV。代码如下:

#include <opencv2/opencv.hpp>
//#include <cv.h>
//#include <cxcore.h>
//#include <highgui.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
#include "EqualizeHist.h"
//typedef unsigned char uchar;

IplImage* EqualizeHistColorImage(IplImage *pImage)
{
    IplImage *pEquaImage = cvCreateImage(cvGetSize(pImage), pImage->depth, 3);  

    // 原图像分成各通道后再均衡化,最后合并即彩色图像的直方图均衡化
    const int MAX_CHANNEL = 4;
    IplImage *pImageChannel[MAX_CHANNEL] = {NULL};  

    int i;
    for (i = 0; i < pImage->nChannels; i++)
        pImageChannel[i] = cvCreateImage(cvGetSize(pImage), pImage->depth, 1);  

    cvSplit(pImage, pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3]);  

    for (i = 0; i < pImage->nChannels; i++)
     // cvEqualizeHist(pImageChannel[i], pImageChannel[i]);
  	EqualizeHist( (uchar*)(pImageChannel[i]->imageData), (uchar*)(pImageChannel[i]->imageData),pImage->width,pImage->height );
    cvMerge(pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3], pEquaImage);  

    for (i = 0; i < pImage->nChannels; i++)
        cvReleaseImage(&pImageChannel[i]);  

    return pEquaImage;
} 

int main( int argc, char** argv )
{
      IplImage* pImg; //声明IplImage指针
	IplImage* pEquaImage;
	clock_t start, finish;
      	double time;
      //载入图像,强制转化为Gray   

	pImg = cvLoadImage( "nupt.jpg", CV_LOAD_IMAGE_UNCHANGED);
	if(pImg==NULL)
		return -1;
	printf("Load img success\n"); 

	start = clock();
	pEquaImage = EqualizeHistColorImage(pImg);
	finish = clock();
	time = (double)(finish - start) / CLOCKS_PER_SEC;
    	printf( "finish operation for %dchannels in %lf seconds\n",pImg->nChannels,time);

	cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
	cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);
	cvShowImage("src",pImg);
	cvShowImage("dst",pEquaImage);
	cvWaitKey(0);
	cvSaveImage("ret.jpg", pEquaImage);//把图像写入文件
	cvReleaseImage(&pImg); //释放图像
	cvReleaseImage(&pEquaImage);
          return 0;  

} 
//#include <math.h>
#include <assert.h>
typedef unsigned char uchar;
void EqualizeHist( const unsigned char* src,unsigned char* dst,int width,int height )
{
    int x,y;
    const int hist_sz = 256;
    int hist[hist_sz];
    memset(hist, 0, sizeof(hist));
    int size = width*height;
//统计每个灰度值出现的次数
	for(x=0;x<size;x++){
			assert(*(src+x)<257 && *(src+x)>=0);
            hist[*(src+x)]++;
	}
    
    float scale = 255.f/(width*height);
    int sum = 0;
    uchar lut[hist_sz+1];

    for(x = 0; x < hist_sz; x++ )
    {
        sum += hist[x];
        //int val = round(sum*scale);
		int val =(sum*scale+0.5);
        lut[x] = val;
    }

    lut[0] = 0;
    for( y = 0; y < size; y++ )
    {

            *(dst+y) = lut[*(src+y)];
					if(y%100==0)
		printf("%d\n",*(dst+y));
    }
}

原图:

效果图

图像直方图均衡化增强opencv与C语言版,布布扣,bubuko.com

时间: 2024-10-20 06:14:32

图像直方图均衡化增强opencv与C语言版的相关文章

opencv图像直方图均衡化及其原理

直方图均衡化是什么有什么用 先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化. 图像直方图均衡化作用:用来增强对比度. 这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好地在直方图上分布.这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能. 这种方法对于背景和前景都太亮或者太

图像直方图均衡化(C#)

关于图像直方图均衡化的原理和步骤先不作讨论,我就看看代码吧. private Bitmap picequalization(Bitmap basemap, int width, int height) { Bitmap retmap = new Bitmap(basemap, width, height); int size = width * height; int[] gray = new int[256]; double[] graydense = new double[256]; for

Python实现图像直方图均衡化算法

title: "Python实现图像直方图均衡化算法" date: 2018-06-12T17:10:48+08:00 tags: [""] categories: ["python"] 效果图 代码 #!/usr/bin/env python3 # coding=utf-8 import matplotlib.image as mpimg from matplotlib import pyplot as plt import sys impor

opencv:图像直方图均衡化

// 直方图均衡化 Mat gray, dst; cvtColor(src, gray, COLOR_BGR2GRAY); equalizeHist(gray, dst); imshow("gray", gray); imshow("equalizeHist", dst); 原文地址:https://www.cnblogs.com/wbyixx/p/12246837.html

图像直方图均衡化

1. 直方图均衡化介绍 自我感觉书上讲的很清楚,直接把截图贴上了. 在进行直方图均值化的过程如下 读入图像对每个通道分别统计像素值[0,255]出现的次数.对每个通道分别求像素值[0,255]出现的概率,得到概率直方图.对每个通道分别求像素值[0,255]概率的前缀和,得到累计直方图.对每个通道根据累计直方图分别求像素映射函数.对每个通道完成每个像素点的映射.输出直方图均衡化的图像.2.代码(MATLAB) 1 %直方图均衡化 2 I = imread('D:/picture/girl.jpg'

《OpenCV:直方图应用:直方图均衡化,直方图匹配,对比直方图》

直方图均衡化 直方图均衡化(Histogram Equalization)是直方图最典型的应用,是图像点运算的一种.对于一幅输入图像,通过运算产生一幅输出图像,点运算是指输出图像的每个像素点的灰度值由输入像素点决定,即: 直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数过程.从分布图上的理解就是希望原始图像中y轴的值在新的分布中尽可能的展开.变换过程是利用累积分布函数对原始分布进行映射,生成新的均匀拉伸的分布.因此对应每个点的操作是寻找原始分布

图像直方图与直方图均衡化

图像直方图与直方图均衡化 图像直方图以及灰度与彩色图像的直方图均衡化 图像直方图: 概述: 图像的直方图用来表征该图像像素值的分布情况.用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目. 图像直方图图形化显示不同的像素值在不同的强度值上的出现频率,对于灰度图像来说强度范围为[0~255]之间,对于RGB的彩色图像可以独立显示三种颜色的图像直方图. 同时直方图是用来寻找灰度图像二值化阈值常用而且是有效的手段之一,如果一幅灰度图像的直方图显示为两个波

图像一些简单增强

灰度级变换自动对比度调整 线性灰度级变换 非线性灰度级变换 直方图修正 灰度直方图 直方图性质 直方图修正法理论 直方图均衡化 直方图规定化 基于同态滤波的增强处理 基于彩色处理的增强处理 Gamma校正 图像处理原彩图 为了改善图像的质量以及增强感兴趣部分. 如光线较暗的图像,需要增强图像的亮度;通过监测高速公路上的白线实现汽车自动驾驶时需要检测边线等.有针对单个像素点的点运算算法,也有针对像素局部领域的模板运算. 灰度级变换(自动对比度调整) 灰度级变换借助函数变换将输入的像素灰度值映射成一

python实现直方图均衡化,理想高通滤波与高斯低通滤波

写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化,实验算法仅供参考. 实验要求 实现图像直方图均衡化,要求显示均衡化前.后直方图以及均衡化后图像. 对单通道图像进行DFT变换,要求显示幅度图和相位图,并设计理想高通滤波器和高斯低通滤波器对图像进行频域滤波,并显示滤波之后的图像. 注:除DFT和IDFT外,不允许调库 实验代码 代码首先贴在这里,仅供