OPENCV下针对IplImage实现图像增强处理

OPENCV下针对IplImage实现图像增强处理

因为使用的摄像头图像质量很差,不能直接用做分割等后续的处理,需要根据直方图进行图像增强,OPENCV没有现成的方法,只有自己想办法了。 参考了网上文章 http://www.xiaozhou.net/ReadNews.asp?NewsID=771 原理就是利用直方图统计分布,将图像灰度的域值拉伸到0-255,原来网上的代码有些问题,而且是使用bmp的,我就改成了IplImage了,于是在OPENCV实现了这个功能,感觉效果不错,可以看到昏暗的图像可以增强的很好。

 

 

 

 

// Open17.cpp : Defines the entry point for the console application.

//

// http://blog.csdn.net/soarnic/archive/2008/09/26/2985116.aspx

// http://blog.csdn.net/hardVB/archive/2007/01/05/1474880.aspx

 

 

#include "stdafx.h"

 

 

#include "stdafx.h"

 

#include "cv.h"

#include "highgui.h"

 

/*************************************************

Function:       

Description:     因为摄像头图像质量差,需要根据直方图进行图像增强,

将图像灰度的域值拉伸到0-255

Calls:         

Called By:     

Input:           单通道灰度图像                 

Output:          同样大小的单通道灰度图像

Return:         

Others:           http://www.xiaozhou.net/ReadNews.asp?NewsID=771

DATE:               2007-1-5

*************************************************/

bool ImageStretchByHistogram(IplImage *src,IplImage *dst)

{

    // p[]存放图像各个灰度级的出现概率;

    // p1[]存放各个灰度级之前的概率和,用于直方图变换;

    // num[]存放图象各个灰度级出现的次数;

      

    assert(src->width == dst->width);

   

    float p[256], p1[256], num[256];

    // 清空三个数组

    memset(p, 0, sizeof(p));

    memset(p1, 0, sizeof(p1));

    memset(num, 0, sizeof(num));

      

    int height = src->height;

    int width = src->width;

    long wMulh = height * width;

 

       int i, x, y, k;

      

    // 求存放图象各个灰度级出现的次数

    // to do use openmp

    for(x = 0; x < width; x++)

    {

        for(y = 0; y< height; y++)

        {

            uchar v = ((uchar*)(src->imageData + src->widthStep * y))[x];

            num[v]++;

        }

    }

      

    // 求存放图像各个灰度级的出现概率

    for(i = 0; i < 256; i++)

    {

        p[i] = num[i] / wMulh;

    }

      

    // 求存放各个灰度级之前的概率和

    for(i = 0; i < 256; i++)

    {

        for(k = 0; k <= i; k++)

            p1[i] += p[k];

    }

      

    // 直方图变换

    // to do use openmp

    for(x = 0; x < width; x++)

    {

        for(y = 0; y < height; y++)

        {

            uchar v = ((uchar*)(src->imageData + src->widthStep * y))[x];

            ((uchar*)(dst->imageData + dst->widthStep*y))[x] = p1[v] * 255 + 0.5;            

        }

    }    

    return true;

      

}

 

int main(int argc, char* argv[])

{

       IplImage * pImg;   

    pImg = cvLoadImage("c://o_Image_Stretch.jpg", -1);

      

       // 创建一个灰度图像

    IplImage* GrayImage = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);

    IplImage* dstGrayImage = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);

    cvCvtColor(pImg, GrayImage, CV_BGR2GRAY);

    ImageStretchByHistogram(GrayImage, dstGrayImage);

      

       cvNamedWindow("dstGrayImage", 1);                      // 创建窗口

       cvNamedWindow("GrayImage", 1);                                 // 创建窗口

       cvShowImage("dstGrayImage", dstGrayImage);         // 显示图像

       cvShowImage("GrayImage", GrayImage);                 // 显示图像

       cvWaitKey(0);                                                               // 等待按键

      

       cvDestroyWindow( "dstGrayImage" );                       // 销毁窗口

       cvDestroyWindow( "GrayImage" );                                  // 销毁窗口

       cvReleaseImage(&pImg);                                                // 释放图像

       cvReleaseImage(&GrayImage);                                        // 释放图像

       cvReleaseImage(&dstGrayImage);                             // 释放图像

}    

      

      

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值