C ++拉伸均衡图像

时间:2014-09-14 06:08:00

标签: c++ opencv histogram stretching

从(2)均衡图像中我必须创建一个(3)。

  1. 原始图片:http://i.imgur.com/X5MKF6z.jpg
  2. 均衡图片:http://i.imgur.com/oFBVUJp.png
  3. 均衡和拉伸图片:http://i.imgur.com/V7jeaRQ.png
  4. 使用OpenCV我可以使用均衡和拉伸的equalizeHist()。

    因此,如果不使用OPENCV,我如何从均衡图像进行拉伸。均衡部分在下面完成。

    #include <iostream>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv/highgui.h>
    #include <cstring>
    using std::cout;
    using std::cin;
    using std::endl;
    
    using namespace cv;
    
    void imhist(Mat image, int histogram[])
    {
    
        // initialize all intensity values to 0
        for (int i = 0; i < 256; i++)
        {
            histogram[i] = 0;
        }
    
        // calculate the no of pixels for each intensity values
        for (int y = 0; y < image.rows; y++)
            for (int x = 0; x < image.cols; x++)
                histogram[(int)image.at<uchar>(y, x)]++;
    
    }
    
    void cumhist(int histogram[], int cumhistogram[])
    {
        cumhistogram[0] = histogram[0];
    
        for (int i = 1; i < 256; i++)
        {
            cumhistogram[i] = histogram[i] + cumhistogram[i - 1];
        }
    }
    
    int main()
    {
        // Load the image
        Mat image = imread("y1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    
        // Generate the histogram
        int histogram[256];
        imhist(image, histogram);
    
    
        // Caluculate the size of image
        int size = image.rows * image.cols;
        float alpha = 255.0 / size;
    
        // Calculate the probability of each intensity
        float PrRk[256];
        for (int i = 0; i < 256; i++)
        {
            PrRk[i] = (double)histogram[i] / size;
        }
    
        // Generate cumulative frequency histogram
        int cumhistogram[256];
        cumhist(histogram, cumhistogram);
    
        // Scale the histogram
        int Sk[256];
        for (int i = 0; i < 256; i++)
        {
            Sk[i] = cvRound((double)cumhistogram[i] * alpha);
        }
    
        // Generate the equlized image
        Mat new_image = image.clone();
    
        for (int y = 0; y < image.rows; y++)
            for (int x = 0; x < image.cols; x++)
                new_image.at<uchar>(y, x) = saturate_cast<uchar>(Sk[image.at<uchar>(y, x)]);
        //////////////////////////////////////////
    
        // // Generate the histogram stretched image
        Mat str_image = new_image.clone();
    
        //for (int a = 0; a < str_image.rows; a++)
        //  for (int b = 0; b < str_image.cols; b++)
    
        // Display the original Image
        namedWindow("Original Image");
        imshow("Original Image", image);
    
        // Display equilized image
        namedWindow("Equalized Image");
        imshow("Equalized Image", new_image);
    
    
        waitKey();
        return 0;
    }
    

1 个答案:

答案 0 :(得分:2)

执行此操作的常规方法是找到最暗的像素,并找到最亮的像素。你可以在一个循环循环中迭代你的所有像素,这样的伪代码:

darkest=pixel[0,0]   // assume first pixel is darkest for now, and overwrite later
brightest=pixel[0,0] // assume first pixel is lightest for now, and overwrite later
for all pixels
    if this pixel < darkest
       darkest = this pixel
    else if this pixel > brightest
       brightest = this pixel
    endif
end for

足够简单。所以,让我们说最黑暗和最聪明的人分别是80和220。现在你需要将这个范围80..220拉伸到整个范围0..255。

因此,您从图像中的每个像素中减去80,以在直方图的左端向下移动到零,因此您的范围现在为0..140。所以现在你需要将每个像素乘以255/140以将右端扩展到255.当然,你可以在像素阵列上一次完成两个算术运算。

for all pixels
   newvalue = int((current value - darkest)*255/(brightest-darkest))
end for