I am trying to shape histogram of an image into a parabolic curve. I am following histogram matching technique specified in Digital Image Processing Book by Gonzalez and Woods. Following this, I get below results.
But I thought the transformed histogram will be somewhat like the specified histogram. Am I doing something wrong here or is it supposed to be like this?
I am also including the MATLAB script that I have used to get these results.
clear
clc
inputImage = rgb2gray(imread('office_2.jpg'));
[counts, bins] = imhist(inputImage);
% Highest intensity level from bin count
intensityLevel = max(bins);
subplot(2, 2, 1);
imhist(inputImage), title('Original Histogram');
pixelCount = numel(inputImage);
% Histogram Equalization
normalizedCounts = counts/sum(counts);
subplot(2, 2, 2);
newIntensities = cumsum(normalizedCounts);
% Maps each value of inputImage to corresponding indexed value of
% newIntensities
eqImage = newIntensities(inputImage+1);
eqImage = uint8(eqImage*intensityLevel);
imhist(eqImage), title('Equalized Histogram')
subplot(2, 2, 3), imshow(inputImage), title('Input Image')
subplot(2, 2, 4), imshow(eqImage), title('Equalized Image')
% Histogram Matching
X = 0:255;
Y = ((X-127).^2);
Y = reshape(Y,[],1);
normalizedY = Y/sum(Y);
summedNormY = cumsum(normalizedY);
transformedIntensities = round(255*summedNormY);
specifiedIntensities = newIntensities*intensityLevel;
for i = 1:length(transformedIntensities)
[x, specifiedIntensities(i)] = min(abs(transformedIntensities-specifiedIntensities(i)));
end
specifiedIntensities = specifiedIntensities - 1;
transformedImage = uint8(specifiedIntensities(inputImage+1));
figure
subplot(1, 3, 2), imhist(transformedImage), title('Transformed Histogram')
subplot(1, 3, 1), imshow(transformedImage), title('Transformed Image')
subplot(1, 3, 3), bar(normalizedY), title('Normalized Specified Hist.')