用Java实现MATLAB代码
我有以下用MATLAB编写的代码,摘自 此代码应将3通道RGB图像转换为其照明不变量。我想知道代码在做什么,以便用Java实现它用Java实现MATLAB代码,java,matlab,image-processing,Java,Matlab,Image Processing,我有以下用MATLAB编写的代码,摘自 此代码应将3通道RGB图像转换为其照明不变量。我想知道代码在做什么,以便用Java实现它 从我收集到的信息来看,它计算每个红/绿/蓝像素的对数,并相互减去值,但结果不是整数,因此在更改RGB值时,我无法将其应用于Java的BuffereImage类。如何在Java中模拟此函数?您可以根据需要在Java中找到许多矩阵库。我建议您可以选择将逻辑转换为Java。将函数转换为Java并不难。 下面的代码示例是一个MATLAB实现,可以直接转换为JAVA 您应该注意
从我收集到的信息来看,它计算每个红/绿/蓝像素的对数,并相互减去值,但结果不是整数,因此在更改RGB值时,我无法将其应用于Java的
BuffereImage
类。如何在Java中模拟此函数?您可以根据需要在Java中找到许多矩阵库。我建议您可以选择将逻辑转换为Java。将函数转换为Java并不难。下面的代码示例是一个MATLAB实现,可以直接转换为JAVA 您应该注意输入和输出元素的范围和类型,以及内存顺序 请阅读以下代码中的注释:
%function[ii_image]=RGB2照明变量(图像,alpha)
%初始化输入(用于执行示例):
image=imread('peppers.png');
图像=最大值(图像,1);%将零值替换为1,因为日志(0)是-Inf
image=double(image)/255;%将图像转换为范围[1/255,1]内的双精度图像。在JAVA中,如果pix是范围为[0255]的字节,则应该使用double(pix)/255。
α=0.9;
ii_image=0.5+log(image(:,:,2))-alpha*log(image(:,:,3))-(1-alpha)*log(image(:,:,1));
%假设JAVA中的元素存储在三个2D数组(3个平面)中:R、G、B
%例如:double[]R=newdouble[384][512];
%在Matlab中,3个平面为:
R=图像(:,:,1);
G=图像(:,:,2);
B=图像(:,:,3);
%II_图像=0.5+对数(G)-α*对数(B)-(1-α)*对数(R);
II_图像=零(大小(R));
%等效于循环(易于在JAVA中实现):
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
图像宽度=大小(图像,2);
图像高度=大小(图像,1);
对于y=1:image\u height%迭代行,JAVA:for(y=0;y
我希望它能在JAVA实现中帮助您。如果图像值在0到1的范围内,那么您仍然可以将其保存在BuffereImage中,因为您可以使用
new color(0.1,0.2,0.3)
创建新的颜色值。如果您想使用优化的库,那么看看JavaCV(opencv包装器),这里谢谢您的回答。我即将完成它,但是p
的一些计算不在[0,1]范围内。有些数字为负数或大于1。我得到每个像素的R,G,B值,并在确保其非零后将每个R,G,B像素除以255。然后我进行对数计算,但它不在正确的范围内。你知道可能是什么问题吗?你安装了MATLAB吗?您可以执行MATLAB代码,并查看结果。我得到:min(ii_图像)=-2.4237
和max(ii_图像)=5.2882
。没有保证计算结果会在范围内。是的,代码在MATLAB中工作,我的测试图像的范围是相同的。在Java中执行此操作时,无法使用结果设置RGB值,因为它不在[0,1]之间。有没有办法将这些数字转换为[0,1]的范围?我添加了一个示例:查找最小值和最大值,并从每个元素中减去最小值,然后除以(最大值-最小值)。
function [ ii_image ] = RGB2IlluminationInvariant( image, alpha )
ii_image = 0.5 + log(image(:,:,2)) - alpha*log(image(:,:,3)) - (1-alpha)*log(image(:,:,1));