首页   |   SCI期刊点评   |   中文期刊点评   |   搜索   |   论文范文   |   小木虫论坛
小木虫 学术科研第一站
首页 >> 信息科学 >> 查看话题

【求助】matlab如何只读取图像的一部分?

作者: afgh2587849 (站内联系TA)    发布: 2010-11-08
用matlab处理图像的时候遇到了一个问题,图像太大而且数目比较多,但感兴趣的只是图像中的一部分,现在想做的就是比如说对1024*1024的图像只读取200*200的这一小部分,不是先把整幅图像读进来然后再取矩阵的一部分,而是一开始就只读这一小部分图像,请问该如何操作?
广告
将图像当文件读就可以了,fread。
.bmp等没压缩的图像很简单。.jpg等压缩格式图像就比较麻烦了。
Originally posted by string121 at 2010-11-15 20:26:25:
将图像当文件读就可以了,fread。
.bmp等没压缩的图像很简单。.jpg等压缩格式图像就比较麻烦了。
谢谢回复,是.pgm格式的,P5格式,请问这个具体该如何去读?
直接用fread就可以
Originally posted by jessican at 2010-11-17 05:00:21:
直接用fread就可以
麻烦您能给个script的例子吗,我也试过fread,没成功  pgm(P5)格式的图片
你参考下rawread函数。
function  = rawread(filename,n,m);
% RAWREAD Read a Portable Bitmap file, or a raw file.
%       RAWREAD('imagefile.raw', xsize, ysize) reads a "raw" image file
%       RAWREAD('imagefile.pgm') reads a "pgm" (portable gray map) image
%        = RAWREAD('imagefile.raw') returns both the image and a
%       color map, so that
%                = rawread('imagefile.raw',sx,sy);
%       or       = rawread('imagefile.pgm');
%               image(X)
%               colormap(map)
%       will display the result with the proper colors.
%
%       NOTE : map is optional and could be replaced during the display by
%              the "colormap('gray')" command
%
%       See also IMWRITE, IMREAD, IMAGE, COLORMAP.
dot = max(find(filename == '.'));
suffix = filename(dot+1:dot+3);
% 提取图像文件后缀
if strcmp(suffix,'pgm') | strcmp(suffix,'raw')
    % 要求是pgm格式或者raw格式
    disp(sprintf('\nopens %s file\n',filename));
    fp = fopen(filename,'rb','b');  % "Big-endian" byte order.
   
    if (fp<0)
        error();
    end
   
    if strcmp(suffix,'pgm')
        % Read and crack the header
        
        head = fread(fp,2,'uchar'); % pgm magic number : P5
        if ~strcmp(head,'P5'),
            fprintf(1,'\n Magic Number : %s\n',head); % 默认打印到窗口
        else
            fprintf(1,'\n Bad Magic Number : %s\n',head);
            error('cannot continue this way, good bye cruel world');
        end
        
        c = fread(fp,1,'uchar'); %reads the carriage return separating P5 from the creator
        
        precreator = fread(fp,1,'uchar'); % look for a '#' character preceeding a creator signature
        if precreator == '#',
            c = setstr(20);  % any character except carriage return
            cr = setstr(10); % defines a carriage return
            while c ~= cr,
                c = fread(fp,1,'uchar');
                creator = ;
            end;
            fprintf(1,'\n creator : %s\n',creator);
        else
            fprintf('\n No creator signature\n');
            fseek(fp,-1,'cof'); % return one char before
        end
    end
   
    if nargin <2,
        if strcmp(suffix,'raw')
            % assume image size is 256x256
            disp('RAW file without size : assume image size is 256x256');
            n = 256;
            m = 256;
        else % for PGM files
            % reads the size and depth
            % pgm格式开头包括维数
            disp(' reads sizes');
            n = fscanf(fp,'%d',1);
            tn = num2str(n);
            disp();
            m = fscanf(fp,'%d',1);
            tm = num2str(m);
            disp();
            p = fscanf(fp,'%d',1);
            tp = num2str(p);
            disp();
            c = fread(fp,1,'uchar'); %reads the last carriage return
        end;
    end
   
    % Creates a gray palette and scale it to .
    disp(' create gray palette');
    % 灰度映射表
    for i=1:256,
        map(i,)=;
    end;
   
    % Read the image
    disp(' Reads image data ...');
     = fread(fp,,'uchar');
    % 维数错了
    if l ~= m*n
        l
        error('HSI image file is wrong length')
    end
    % Image elements are colormap indices, so start at 1.
    X = X'+1;
    fclose(fp);
    disp('end');
else
    error('Image file name must end in ''raw'' or ''pgm''.')
end
呵呵,我只想问问,先把整个读近来,再取一部分有什么不行的?好奇而已。
Originally posted by image_pro at 2010-12-21 16:25:00:
呵呵,我只想问问,先把整个读近来,再取一部分有什么不行的?好奇而已。
当整幅图像是4000*4000,而你感兴趣的部分只是全图的1/30左右,再把图像的数目乘以300, 原因就很明白了
Originally posted by afgh2587849 at 2010-12-23 23:31:29:
当整幅图像是4000*4000,而你感兴趣的部分只是全图的1/30左右,再把图像的数目乘以300, 原因就很明白了
读取一副4000*4000图片,再选择其中1/30的内容到新的矩阵变量中,再删除4000*4000的图片;再读取第二幅4000*4000图片......这样内存应该够用吧.
Originally posted by cctt126 at 2010-12-26 23:14:16:
读取一副4000*4000图片,再选择其中1/30的内容到新的矩阵变量中,再删除4000*4000的图片;再读取第二幅4000*4000图片......这样内存应该够用吧.
我现在的做法跟你的思路差不多,先把需要的内容读到新的矩阵中,然后保存图像,继续这样读、保存....   相当于把原来的图片库按自己的需要重新剪切为小的图片库,以备以后反复使用需要,这样也能够解决问题。
但既然开始的时候想到了直接读取图像一部分,就希望知道有没有办法能做到这一点,但现在还没有什么头绪。
感觉直接用一个同样大小的模版进行操作即可
Originally posted by 姜澜 at 2010-12-28 08:53:27:
感觉直接用一个同样大小的模版进行操作即可
请问能具体说明白一些吗?
>> 查看全部评论
相关推荐
Matlab图像处理问题
Shoney 发表于2012-03-27
欢迎监督和反馈
本帖内容由 afgh2587849 提供,小木虫为个人免费站点,仅提供交流平台,不对该内容负责。
欢迎协助我们监督管理,共同维护互联网健康,如果您对该内容有异议,请立即发邮件到 emuch@126.com 联系通知管理员,也可以通过QQ周知,我们的QQ号为:8835100
我们保证在1个工作日内给予处理和答复,谢谢您的监督。


小木虫,学术科研第一站,为中国学术科研研究提供免费动力
欢迎监督,发现不妥请立即联系管理员  E-mail:emuch@126.com   QQ:8835100
京ICP备05001187号-1
河北廊坊公备131000022172号