Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab-通过移动2D的红色分量来处理3D图像_Matlab_Image Processing_Multidimensional Array - Fatal编程技术网

Matlab-通过移动2D的红色分量来处理3D图像

Matlab-通过移动2D的红色分量来处理3D图像,matlab,image-processing,multidimensional-array,Matlab,Image Processing,Multidimensional Array,我最近被分配了一项与图像处理相关的任务。问题是我以前没有这方面的经验,所以我面临一些困难 其概念是通过最初提取R、G、B分量并在根据某种公式移动红色分量后组合它们,从2D图像创建3D图像(即,通过应用公式a=x(i,j,k)*40/max(Rcomponent(:)计算必须移动的像素)到红色图像的每个元素,并将元素x(i,j-a,k)替换为x(i,j,k)) 以下是我目前的进展: original = imread(nameofimag); % read file imaginfos = imf

我最近被分配了一项与图像处理相关的任务。问题是我以前没有这方面的经验,所以我面临一些困难

其概念是通过最初提取R、G、B分量并在根据某种公式移动红色分量后组合它们,从2D图像创建3D图像(即,通过应用公式
a=x(i,j,k)*40/max(Rcomponent(:)计算必须移动的像素)
到红色图像的每个元素,并将元素
x(i,j-a,k)
替换为
x(i,j,k))

以下是我目前的进展:

original = imread(nameofimag); % read file
imaginfos = imfinfo(nameofimag); % identify colortype 
coltype = imaginfos(1).ColorType;
truecol = 'truecolor';

if strcmp(coltype,truecol) == 1 % convert to grayscale if needed
    originalgray = rgb2gray(original);
else
    originalgray = original;
end

Z = zeros(size(originalgray,1),size(originalgray,2));

% create red, blue, green parts

imagR = cat(3,originalgray,Z,Z);
imagG = cat(3,Z,originalgray,Z);
imagB = cat(3,Z,Z,originalgray);

imagRshifted = zeros(size(originalgray,1),size(originalgray,2));

h = waitbar(0,'Please wait...');

% shift red image

for i = 1:size(imagR,1)
    for j = 1:size(imagR,2)
        for k = 1:size(imagR,3)
            imagRshifted(i,j,k) = imagR(i,j,k);
            pixeltochange = round((imagRshifted(i,j,k)*40)...
                                                /max(original(:)));                
            if pixeltochange < j                    
                imagRshifted(i,j-pixeltochange,k) =...
                                                imagRshifted(i,j,k);
            end
        end
    end
    waitbar(i/size(imagR,1));
end

imagRshifted = uint8(imagRshifted);

% combine R,G,B to create 3D image

imag3D = imfuse(imagRshifted,imfuse(imagG,imagB));

% plot the desired images

if depictrgb == 0;    
    figure;imshow(imag3D);    
else 
    figure;imshow(imag3D);
    figure;imshow(imagR);
    figure;imshow(imagB);
    figure;imshow(imagG);
end

close(h);

end
original=imread(nameofimag);%读取文件
imagingfos=imfinfo(nameofimag);%识别颜色类型
coltype=ImagineFos(1)。颜色类型;
truecol='truecolor';
如果strcmp(coltype,truecol)==1%,则根据需要转换为灰度
原始灰色=RGB2灰色(原始);
其他的
原始灰色=原始;
结束
Z=零(大小(原始灰度,1),大小(原始灰度,2));
%创建红色、蓝色和绿色零件
imagR=cat(3,原始灰色,Z,Z);
imagG=cat(3,Z,原始灰色,Z);
imagB=cat(3,Z,Z,原始灰色);
imagRshifted=零(大小(原始灰度,1),大小(原始灰度,2));
h=waitbar(0,“请稍候…”);
%红移图像
对于i=1:大小(imagR,1)
对于j=1:大小(imagR,2)
对于k=1:大小(imagR,3)
imagR(i,j,k)=imagR(i,j,k);
像素变化=圆形((i,j,k)*40)。。。
/马克斯(原件:);
如果像素变化

正如你所看到的,结果相当混乱(至少对我来说)。首先,有一条线将最终图像分成两部分(似乎该公式仅应用于线的左侧部分,而右侧部分未被触及)。另外,生成的图像更像是随机像素的重建,而不是R、G、B分量的组合

任何想法都将不胜感激


先谢谢你

我的朋友,你有两个主要问题:你不知道自己在做什么,而且你使用Matlab的效率极低

让我们来看看你需要什么,以及如何去做

你把你的问题描述得比较好。让我们重新描述一下

从灰度图像开始,创建一幅彩色图像,其中红色通道偏移量如下式所示:
shift=x_ij*40/max(x(:)

这里缺少了一些东西,比如:如果移位超出图像范围,该怎么办?在这种情况下,我们假设如果偏移太大,则将其设为零

让我们开始:首先,我们将加载一个图像,如果它不是灰度,则将其转换为灰度。我使用的是下图:

现在我们要计算每像素的偏移量,我们可以在一行中完成:

% compute shifts
shift=-round(  double(originalgray)  *40./double(max(originalgray(:)))); 
我们要确保我们没有越过图像,所以我们将计算实际的索引(indY+shift),并检查它是否在图像中

% get indexes
[indY,~]=meshgrid(1:size(originalgray,2),1:size(originalgray,1));

% Make sure we dont go out of the image
shift(indY+shift<=0)=0;
现在我们有了红移,让我们创建一个新的图像,它有RGB值,其中GB是原始图像,R是移位图像

colorImg=cat(3,redshifted,originalgray,originalgray);

imshow(colorImg)
这使得:


结论:此代码将偏移应用于灰度图像(或转换为灰度的truecolor),并生成红移的彩色图像。如果原始图像在没有灰度转换的情况下实际上是真彩色的,则需要进行修改,但这些修改将是次要的,主要涉及将不同位置的
原始灰度
更改为正确的RGB通道访问(例如
原始(:,:,2)
是g)


最后一点注意:要意识到,只有当图像是深度贴图时,3D眼镜的效果才会好。否则,你会得到奇怪的视觉效果,因为图像的颜色与深度无关(因此会置换红色)

你能发布原始图像吗?另外,你知道图像应该是什么样子吗?原始图像会一直是灰度的吗?而且,彩色图像从技术上讲是3D图像。它有x,y,C分量。您将问题描述为2D到3D转换,但使用2D图像中的RGB值,这毫无意义!亲爱的安德,谢谢你的评论。关于你的问题:1)原始图像是左边的图像(表示为“之前”),2)修改后的图像应该是这样的。3) 原始图像将是灰度或真彩色类型(这就是为什么我在代码中使用第一行)。至于你的第二条评论,你指的是红色、绿色、蓝色的零件提取?初始图像是2D,问题是2D到3D的转换。如果图像是truecolor,那么它就是3D!但我还是明白了。让我试试。你能在没有任何编辑的情况下发布原始图像吗?关于你的公式的问题:
a=x(i,j,k)*40/max(Rcomponent(:)
。这有点奇怪<代码>k
?什么是
k
?这不是2D图像吗?什么是
r组件
R
值的最大值?这不是一个二维灰度图像吗?亲爱的Ander,正如我前面提到的,这是我第一次尝试与图像处理相关的任务(因此我不熟悉这门科学的基础知识)。这就是为什么我决定请这个领域的专家帮我澄清问题的本质。在任何c
% allocate memory
redshifted = zeros(size(originalgray,1),size(originalgray,2));

% actually shift red
for ii=1:size(originalgray,1)
    redshifted(ii,:)=originalgray(ii,indY(ii,:)+shift(ii,:));
end
colorImg=cat(3,redshifted,originalgray,originalgray);

imshow(colorImg)