OpenCV入门学习(三)HistogramEquivalent

直方图均衡

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
/*
	有的版本CV_BGR2GRAY宏定义没有,需要加载个legacy文件来获取,但是会与其他调用的宏定义出现冲突,所以
	这里单独定义一个彩色图像到灰度图像的case number
*/
#define CV_BGR2GRAY 6
#include <iostream>
using namespace std;
using namespace cv;

Mat HistogramEquivalent(Mat,int);

int main(){
	Mat img = imread("lenna.jpg");
	imshow("HistogramEqiovalent",HistogramEquivalent(img,256));
	waitKey(100000000);
}

/**
	方法:直方图均衡
	作用:增强图像的对比度,使图像更加清楚,即图像增强的一种方法
	参数:img表示源图像,scalar表示的是最大灰度级(为2时表示二值图像)
*/
Mat HistogramEquivalent(Mat img,int scalar){

	//把图像变成灰度图像
	if(img.channels()!=1)
		cvtColor(img,img,CV_BGR2GRAY);
	//创建个与源图像一样的空图像
	Mat newImage=Mat(img.rows,img.cols,img.type());
	//获取图像的行和列
	int width = img.cols , height = img.rows;
	int count[256]={0};
	double prob[256] = {0};
	int maxPixel = 0,minPixel =scalar-1;

	for(size_t i = 0;i<height;i++)
		for(size_t j=0;j<width;j++){
			int currPixel = img.at<uchar>(i,j);
			count[currPixel]++; //统计每个灰度级有多少个点
			//统计该图像中最大和最小的像素值
			if(currPixel>maxPixel)
				maxPixel = currPixel;
			else if(currPixel<minPixel)
				minPixel = currPixel;
		}

	//计算每个灰度级出现的概率,为获取double型的数据,在后面乘个小数1.0进行隐式转换
	for(size_t num = 0;num<scalar;num++)
		prob[num] = count[num]*1.0/(height*width);
	//计算累积数组
	for(size_t i = 1;i<scalar;i++)
		prob[i] += prob[i-1];
	for(size_t i=0;i<height;i++)
       for(size_t j=0;j<width;j++)
		   newImage.at<uchar>(i,j) = prob[img.at<uchar>(i,j)]*(maxPixel-minPixel)+minPixel;
	return newImage;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 22:42:00

OpenCV入门学习(三)HistogramEquivalent的相关文章

MongoDB入门学习(三):MongoDB的增删查改

对于我们这种菜鸟来说,最重要的不是数据库的管理,也不是数据库的性能,更不是数据库的扩展,而是怎么用好这款数据库,也就是一个数据库提供的最核心的功能,增删查改. 因为MongoDB存储数据都是以文档的模式,所以在操作它的数据时,也是以文档为单位的.那么我们实现增删查改也是以文档为基础,不知道文档是什么的同学可以看看上篇介绍的基本概念. 1.插入文档 向MongoDB集合中插入文档的基本方法是insert: 单个插入 > document = {key : value} > db.collecti

Objective C 快速入门学习三

1.数据类型 和C语言基本一样. 有一个特别数据类型id,可以储存任何类型的对象,它是实现多态和动态绑定的基础. Objective-C 2.程序结构 Objective-C和C的程序结构一模一样,具体用法相同. 顺序.循环.选择 3.基本上Objective-C兼容了C语言所有特点,包括数组.结构.字符串.联合,它们不是对象,面向过程式.建议直接使用相关框架下的相关类,面对对象编程. Objective C 快速入门学习三

OpenCV入门学习(一)图像放缩【简单的按比例放缩,无技术含量】

因为要读研,而且搞的是图像方向,老师说要搞图像方向matlab和openCV是最常用的,所以在读研之前希望把代码从c#和JAVA转到c++中,并且为以后深入的学习图像打好基础.言归正传~ 先利用这个小例子来简单的了解一下图像从读入内存,在内存中操作图像,在屏幕上显示,最终存到硬盘上的全部过程走一遍.本人喜欢把写出的程序变成方法,利用几个必要地参数来进行调用,可以防止以后代码越来越多,让自己看不懂. 1.首先介绍几个结构体 [1]IplImage:Intel Image Processing Li

Egg入门学习(三)---理解中间件作用

Egg是基于koa的,因此Egg的中间件和Koa的中间件是类似的.都是基于洋葱圈模型的. 在Egg中,比如我想禁用某些IP地址来访问我们的网页的时候,在egg.js中我们可以使用中间件来实现这个功能,中间件的作用无非就是说在Egg的外层在包一层来判断某些事情是否符合要求,也就是在洋葱圈模型外面再进行包一层.在Egg入门二学习中(https://www.cnblogs.com/tugenhua0707/p/10226799.html), 我们最后的项目的目录结构如下: egg-demo2 ├──

入门学习三

看“编码之外”提供的JAVA学习视频,觉得很难.于是寻找另外的参照物. 试过“儿童编程”,其实是要学费的.好懂,却觉得交学费时机不成熟. 于是,我又找到“易语言”.——这来自于“我要自学网”.看了几天,觉得便于操作.也懂得多练习“写代码”的熟能生巧逻辑. 由此,我获得一个认识,一切网页web显示,它固然有其“源代码”——你在任何的位置,右击鼠标,均会显示“查看网页源代码”,在另一个维度,就是称呼其为一段程序.信息越复杂,数据越庞大,包含的“程序”就越多.大多数人是迷失在“混沌的信息海洋里面”了的

Opencv 入门学习之图片人脸识别

读入图片,算法检测,画出矩形框 import cv2 from PIL import Image,ImageDraw import os def detectFaces(image_name): img = cv2.imread(image_name) face_cascade = cv2.CascadeClassifier('../opencv-2.4.9/data/haarcascades/haarcascade_frontalface_default.xml') if img.ndim==

dubbo入门学习(三)-----dubbo整合springboot

springboot节省了大量的精力去配置各种bean,因此通过一个简单的demo来整合springboot与dubbo 一.创建boot-user-service-provider 本篇博文基于上篇中的dubbo项目,整体工程如下: 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

OpenGL入门学习

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的

汇编入门学习笔记 (三) —— 第一个程序

疯狂的暑假学习之  汇编入门学习笔记 (三)-- 第一个程序 参考:<汇编语言> 王爽  第四章 1.一个源程序从写到执行的过程 第一步:编写汇编源程序 第二步:对源程序进行编译连接 第三步:在操作系统中执行 2.源程序 代码: assume cs:first first segment start: mov ax,2 add ax,ax add ax,ax mov ax,4C00H int 21H first ends end start 代码解释: assume .segment.ends