【问题标题】:Making a copy of an image via a Loop not working通过循环复制图像不起作用
【发布时间】:2019-03-25 15:37:25
【问题描述】:

我知道为什么代码不起作用。它所做的只是给我一个空白的白色图像。如果你没有在 zeros(x, y) 之前声明一个矩阵,那么它就可以正常工作。这里有什么问题吗?

我之前尝试过不声明 zeros 矩阵,只有这样才有效。我什至尝试过 img2(i,j) = img2(i,j)+img1(i,j)

function [imgOut] = scaleLoopBased(img,s)
%UNTITLED4 Summary of this function goes here
%   creating a zero matrix of the given scale
[rows,columns]=size(img);
imgTemp=zeros(rows, columns);

for i=1:rows
    for j=1:columns
        imgTemp(i, j) = img(i, j);
    end
end

imshow(imgTemp);

imgOut = imgTemp;
end

空白图片

【问题讨论】:

    标签: matlab loops matrix


    【解决方案1】:

    这是由于您的新图像(double 类型,zeros 默认创建的)与原始图像(通常类型为 uint8)的类型不同。您可以通过使用class 函数并传递an additional argument to zeros 将新图像初始化为具有与原始图像相同的数据类型来解决此问题:

    imgTemp = zeros(rows, columns, class(img));
    

    当您不初始化imgTemp 时它正常工作的原因是因为MATLAB 在您执行第一个索引赋值时默认使用img 的数据类型为您初始化变量。

    imshow 实用程序需要标准image types in MATLAB 之一。 double 类型的图像的值应跨越[0 1] 范围,而uint8 类型的图像将具有[0 255] 范围内的值。在您的示例中,您可能有一个矩阵imgTemp,其类型为double,但其值跨越[0 255]。解决问题的另一种方法是明确告诉imshow 用于显示的值范围(因为默认的[0 1] 不起作用):

    imshow(imgTemp, [0 255]);
    

    在操作或处理图像时始终注意数据类型。您可能需要来回缩放或转换,使用double 类型进行计算(因为整数饱和)和uint8 类型用于显示和读取/写入文件。

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      相关资源
      最近更新 更多