【问题标题】:Implementing MATLAB Code in Java- Illumination Invariant在 Java 中实现 MATLAB 代码 - 光照不变量
【发布时间】:2019-05-29 15:06:45
【问题描述】:

我有以下用 MATLAB 编写的代码,取自 this paper on page 3:

function [ ii_image ] = RGB2IlluminationInvariant( image, alpha )
ii_image = 0.5 + log(image(:,:,2)) - alpha*log(image(:,:,3)) - (1-alpha)*log(image(:,:,1));

此代码应将 3 通道 RGB 图像转换为其照明不变量。我想知道代码在做什么,以便我可以在 Java 中实现它。

据我所知,它正在计算每个红/绿/蓝像素的对数,然后将这些值相减,但结果不是整数,所以我不能将它应用于 Java 的 @更改 RGB 值时的 987654324@ 类。如何在 Java 中模拟这个函数?

【问题讨论】:

  • 如果图像值在 0 到 1 的范围内,那么您仍然可以将其保存在 BufferedImage 中,因为您可以使用 new Color(0.1,0.2,0.3) 创建新的颜色值。如果您想使用优化的库,请在此处查看 JavaCV(opencv 包装器)github.com/bytedeco/javacv

标签: java matlab image-processing


【解决方案1】:

函数转换成JAVA并没有那么难。
以下代码示例是一个 MATLAB 实现,可以直接转换为 JAVA。

您应该注意输入和输出元素的范围和类型,以及内存排序。

读取下面代码中的cmets:

%function [ ii_image ] = RGB2IlluminationInvariant( image, alpha )

%Initialize input (for executing the example):
image = imread('peppers.png');
image = max(image, 1); %Replace zero values with 1, because log(0) is -Inf
image = double(image)/255; %Convert image to double in range [1/255, 1]. In JAVA, you should use double(pix)/255 if pix is a byte in range [0, 255].
alpha = 0.9;

ii_image = 0.5 + log(image(:,:,2)) - alpha*log(image(:,:,3)) - (1-alpha)*log(image(:,:,1));

%Assume elements in JAVA are stored in three 2D arrays (3 planes): R, G, B
%For example: double[][] R = new double[384][512];
%In Matlab 3 planes are:
R = image(:,:,1);
G = image(:,:,2);
B = image(:,:,3);
%II_image = 0.5 + log(G) - alpha*log(B) - (1-alpha)*log(R);
II_image = zeros(size(R));

%Equivalent for loop (simple to implement in JAVA):
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
image_width = size(image, 2);
image_height = size(image, 1);
for y = 1:image_height %Iterate rows, In JAVA: for(y = 0; y < image_height; y++)
    for x = 1:image_width %Iterate columns, In JAVA: for(x = 0; x < image_width; x++)
        r = R(y, x); %In JAVA: double r = R[y][x];
        g = G(y, x);
        b = B(y, x);

        p = 0.5 + log(g) - alpha*log(b) - (1.0-alpha)*log(r);

        II_image(y, x) = p;
    end
end

%Display ii_image
figure;imshow(ii_image, []);impixelinfo;title('ii\_image');

%Show difference (for debugging):
%figure;imshow(ii_image - II_image, []);impixelinfo

%Display minimum and maximum - values are not valid as pixel values in JAVA.
disp(['min(ii_image) = ', num2str(min(ii_image(:)))]);
disp(['max(ii_image) = ', num2str(max(ii_image(:)))]);


%Convert II_image range to [0, 1]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Find minimum and maximum (in JAVA you can do it inside the loop).
lo = min(II_image(:));
hi = max(II_image(:));

%Apply linear transformation:
II_image = (II_image - lo) / (hi - lo);

figure;imshow(II_image, []);impixelinfo;title('II\_image');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

希望对您的 JAVA 实现有所帮助。

【讨论】:

  • 感谢您的回答。我即将完成它,但p 的一些计算不在 [0,1] 范围内。有些数字是负数或大于 1。我得到每个像素的 R、G、B 值,并在确保它不为零后将每个 R、G、B 像素除以 255。然后我进行对数计算,但它不在正确的范围内。你知道可能是什么问题吗?
  • 您安装了 MATLAB 吗?您可以执行 MATLAB 代码,并查看结果。
  • 我收到:min(ii_image) = -2.4237max(ii_image) = 5.2882。无法保证计算结果在范围内。
  • 是的,代码在 MATLAB 中工作,我的测试图像的范围是相同的。当我在 Java 中执行此操作时,我无法使用结果来设置 RGB 值,因为它不在 [0,1] 之间。有没有办法将这些数字转换为 [0,1] 的范围内?
  • 我添加了一个示例:找到最小值和最大值,并从每个元素中:减去最小值并除以(最大值 - 最小值)。
【解决方案2】:

你可以根据here找到很多Java中的矩阵库。我建议您可以选择EJML 将您的逻辑转换为Java。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2021-08-05
    • 2018-08-19
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多