本以为MATLAB的图像扫描显示很简单,先创建一个三维数组A,全部赋值为255(显示为白色),然后读入图像数组B,将B的元素逐行赋值给A,每赋值一次,显示A一次,中间停顿0.01秒即可。想得简单,做起来必然复杂,程序完成后,提示:Error using ==> image
TrueColor CData contains element out of range 0.0 <= value <= 1.0。imshow()函数可以运行,但完全不是我想要的结果,百思不得其解,那是个崩溃啊。做了半天无用空,决定还是从MATLAB的文档看起,help image,选中doc image,看了一眼,立刻有所醒悟:
When you read image data into MATLAB using imread, the data is usually stored as an array of 8-bit integers. However, imread also supports reading 16-bit-per-pixel data from TIFF and PNG files. These are more efficient storage methods than the double-precision (64-bit) floating-point numbers that MATLAB typically uses. However, it is necessary for MATLAB to interpret 8-bit and 16-bit image data differently from 64-bit data. This table summarizes these differences.
Image TypeDouble-Precision Data
(double Array)8-Bit Data (uint8 Array)
true color (RGB)Image is stored as a three-dimensional(m-by-n-by-3 http://www.liangpinwu.com) array of floating-point values in the range [0, 1].Image is stored as a three-dimensional (m-by-n-by-3) array of integers in the range [0, 255] (uint8) or [0, 65535] (uint16).
回到命令行,输入whos回车,显示如下:
Name Size Bytes Class
Img 140x102x3 42840 uint8 array
Img1 140x102x3 342720 double array
a 1x1 8 double array
b 1x1 8 double array
c 1x1 8 double array
i 1x1 8 double array
j 1x1 8 double array
k 1x1 8 double array
x 1x1 8 double array
原来在程序里定义的变量都是 double array,而读入的图像却是uint8,ok,将double array转变为uint8即可,保存,运行,完全没有问题,现将程序源码附上,望有助于需要的朋友。
Img=imread('D:/Backup/我的文档/美景6.jpg'); %读入图像
x=size(Img,1);
for a=1:x
for b=1:size(Img,2)
for c=1:3
Img1(a,b,c)=255;
end
end
end
Img1=uint8(Img1); %将double array 转为 uint8
for i=1:x
for j=1:size(Img,2)
for k=1:3
Img1(i,j,k)=Img(i,j,k);
end
end
image(Img1); %显示图像
pause(0.01); %程序停留0.01秒
end
在MATLAB中尝试图像的扫描显示时遇到问题,初始方法导致错误提示:TrueColor CData contains element out of range 0.0 <= value <= 1.0。通过查阅文档了解到,imread读取的8位图像数据需作为uint8数组处理,而非double。程序中定义的变量是double,导致不匹配。解决方案是将double数组转换为uint8。修正后的代码成功实现了逐行赋值并显示图像。
3436

被折叠的 条评论
为什么被折叠?



