本文主要是介绍圖像處理基本算法-直方圖均衡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://blog.csdn.net/renshengrumenglibing/article/details/7065330
直方圖是多種空間處理技術的基礎,可以用於圖像增強。同時在其他的處
理方法中也十分有用,比如圖像壓縮和分割。
基本的原理:
Ni = 255*(N0 + N1 + N2 +……Ni)/(width*height)
程序流程:
1、統計各個像素值的個數
2、建立映射表
3、賦予新值
處理後圖像:
源代碼:
- #include<cv.h>
- #include<highgui.h>
- int main(){
- IplImage * image;
- image = cvLoadImage("E:\\image\\pollen.jpg",0);
- cvNamedWindow("image",CV_WINDOW_AUTOSIZE);
- //cvSaveImage("E:\\image\\pollen.jpg",image,0);
- cvShowImage("image",image);
- cvWaitKey(0);
- unsigned char * ptr;
- int count[256] = {0};//灰度值的個數
- int map[256];//灰度映射表
- int temp;
- if(image->nChannels == 3){
- return 0;
- }
- else if(image->nChannels == 1){
- //統計各個灰度值的個數
- for(int i = 0 ; i < image->height;i++){
- for(int j = 0; j< image->width;j++){
- ptr = (unsigned char *)image->imageData + i*image->widthStep + j;
- count[*ptr]++;
- }
- }
- //建立映射表
- for(int m = 0 ; m< 256 ; m++){
- temp = 0;
- for(int n = 0 ; n<= m ;n++){
- temp += count[n];
- }
- map[m] = (unsigned char)(temp * 255/image->width/image->height);
- }
- //給圖片賦予新值
- for(int i = 0 ; i < image->height;i++){
- for(int j = 0; j< image->width;j++){
- ptr = (unsigned char *)image->imageData + i*image->widthStep +j;
- *ptr = map[*ptr];
- }
- }
- }
- cvShowImage("image",image);
- cvWaitKey(0);
- cvSaveImage("E:\\image\\pollen2.jpg",image,0);
- return 0;
- }
这篇关于圖像處理基本算法-直方圖均衡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!