将直方图的CDF从matlab转换为c#?

时间:2017-12-27 02:07:39

标签: c# matlab histogram aforge cdf

如何将此matlab代码转换为AForge.net + c#代码?

cdf1 = cumsum(hist1) / numel(aa); 

我发现Accord.net中存在Histogram.cumulative方法。 但我不知道如何使用。

请教导如何转换。

% Histogram Matching
%

clear
clc
close all

pkg load image

% 이미지 로딩
aa=imread('2.bmp');
ref=imread('ref2.png');

figure(1); imshow(aa); colormap(gray)
figure(2); imshow(ref); colormap(gray)

M = zeros(256,1,'uint8'); % Store mapping - Cast to uint8 to respect data type
hist1 = imhist(aa); % Compute histograms
hist2 = imhist(ref);

cdf1 = cumsum(hist1) / numel(aa); % Compute CDFs
cdf2 = cumsum(hist2) / numel(ref);

% Compute the mapping
for idx = 1 : 256
[~,ind] = min(abs(cdf1(idx) - cdf2));


M(idx) = ind-1;
end

% Now apply the mapping to get first image to make
% the image look like the distribution of the second image
out = M(double(aa)+1);

figure(3); imshow(out); colormap(gray)

1 个答案:

答案 0 :(得分:0)

实际上,我对$("#test .org_name").attr("org-full-name").indexOf("es") > 0 并不了解,但阅读文档我认为Accord.NET类正是您所寻找的(reference here)。问题是它无法为图像构建单个直方图,您必须自己完成。 Matlab中的ImageStatistics只是将三个通道合并,然后计算整个像素的出现次数,这就是你应该做的:

imhist

Bitmap image = new Bitmap(@"C:\Path\To\Image.bmp"); ImageStatistics statistics = new ImageStatistics(image); Double imagePixels = (Double)statistics.PixelsCount; Int32[] histR = statistics.Red.Values.ToArray(); Int32[] histG = statistics.Green.Values.ToArray(); Int32[] histB = statistics.Blue.Values.ToArray(); Int32[] histImage = new Int32[256]; for (Int32 i = 0; i < 256; ++i) histImage[i] = histR[i] + histG[i] + histB[i]; Double cdf = new Double[256]; cdf[0] = (Double)histImage[0]; for (Int32 i = 1; i < 256; ++i) cdf[i] = (Double)(cdf[i] + cdf[i - 1]); for (Int32 i = 0; i < 256; ++i) cdf[i] = cdf[i] / imagePixels; 中,可以从C#RGBR频道值构建G值,如下所示:

B