【问题标题】:Matlab - Image processing 3D image by shifting red component of 2DMatlab - 通过移动 2D 的红色分量来处理 3D 图像
【发布时间】:2016-01-12 03:37:45
【问题描述】:

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

这个概念是从 2D 图像中创建 3D 图像,首先提取 R、G、B 分量并在根据某种公式移动红色分量后将它们组合起来(即计算必须移动的像素通过将公式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

如您所见,结果非常令人困惑(至少对我而言)。起初,有一条线将最终图像分成两部分(似乎该公式仅应用于该线的左侧部分,而右侧部分未受影响)。此外,生成的图像更像是随机像素的重建,而不是 R、G、B 分量的组合。

任何想法都将不胜感激。

提前谢谢你。

【问题讨论】:

  • 可以发一下原图吗?另外,你知道图像应该是什么样子吗?原始图像会一直是灰度的吗?
  • 此外,彩色图像在技术上是的 3D 图像。它有 x,y,C 分量。您将问题描述为 2D 到 3D 的转换,但使用的是 2D 图像中的 RGB 值,这没有任何意义!
  • 亲爱的安德,感谢您的评论。关于您的问题:1)原始图像是左侧的图像(表示为“之前”),2)修改后的图像应该看起来像这样postimg.org/image/5jdglfikt。 3)原始图像将是灰度或真彩色类型(这就是我在代码中使用第一行的原因)。至于您的第二条评论,您指的是红色、绿色、蓝色部分的提取?初始图像是 2D,问题是 2D 到 3D 的转换。
  • 如果图像是真彩色,那么它就是 3D!我还是明白了。让我试试。您可以发布原始图像而不进行任何编辑吗?
  • 关于您的公式的问题:a = x(i,j,k)*40/max(Rcomponent(:))。这有点奇怪。 k ? k 是什么?不是二维图像吗? Rcomponent 是什么? R 值的最大值?不是二维灰度图吗?根据定义,它没有 R。

标签: matlab image-processing multidimensional-array


【解决方案1】:

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

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

你描述你的问题相对不错。让我们重新描述一下。

从灰度图像开始,创建一个彩色图像,其中红色通道移动了以下公式给出的量:shift = x_ij*40/max(x(:))

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

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

% // same as you had
nameofimag='https://2.bp.blogspot.com/-db3zQg7geYA/UYqnvBriBeI/AAAAAAAAAHo/cv3Dy40mUFo/s1600/Meteosat_grid.jpg'
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

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

% compute shifts
shift=-round(  double(originalgray)  *40./double(max(originalgray(:)))); 

并且我们要确保我们不会超过 iamge,因此我们将计算实际索引 (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;

现在我们有了一个适当的转变,我们知道它不会消失。意识到,shift 是一个矩阵size(image),因此我们有我们需要的一切。

现在,让我们使用 R 通道并移动它。意识到,图像是灰度的,因此 R G 和 B 是精确相等的。然后我们将移动原始图像。

% 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

现在我们有了红色偏移,让我们创建一个具有 RGB 值的新图像,其中 GB 是原始图像,R 是偏移图像

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

imshow(colorImg)

这给出了:


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

最后一点:意识到只有在图像是深度图的情况下,使用 3D 眼镜才会看起来不错。否则,你会得到奇怪的视觉效果,因为图像的颜色与它的深度无关(因此红色的位移)

【讨论】:

  • 亲爱的 Ander,正如我之前提到的,这是我第一次尝试处理与图像处理相关的任务(因此我不熟悉这门科学的基础知识)。这就是为什么我决定请这个领域的专家帮助我澄清问题的本质。无论如何,您的回复不仅具有启发性,还帮助我认识到处理此类问题的正确方法。再次感谢您的宝贵时间。
  • @thp 欢迎您!希望它有所帮助!另请注意,matlab 的优势通常是如何避免循环;)。另外,我想重复一遍,以防万一:除非图像的灰度值是它的深度,否则这不会好看!
  • 你的观点其实很准确。这是我在阅读您的帖子时意识到的第一件事。至于深度,这是我会记住的另一个非常有用的信息。谢谢!
猜你喜欢
  • 2012-09-18
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多