opencv — C ++ Растяжение выровненного изображения

Из (2) выровненного изображения я должен создать (3).

  1. Исходное изображение: http://i.imgur.com/X5MKF6z.jpg
  2. Выровненное изображение: http://i.imgur.com/oFBVUJp.png
  3. Выровненное и растянутое изображение: http://i.imgur.com/V7jeaRQ.png

С 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;
}

0

Решение

Обычный способ сделать это — найти самый темный пиксель и самый яркий. Вы можете сделать это в одиночном цикле, перебирая все ваши пиксели, псевдокод, например, так:

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
2

Другие решения


По вопросам рекламы [email protected]