在MATLAB中确定区域平均值

时间:2012-09-19 10:55:40

标签: image matlab image-processing

我需要一些图像中RGB捕获的帮助。 我正在使用impixel来手动从图片中获取RGB,但我想创建一个网格,比方说20x20像素盒,它会自动告诉我每个盒子的RGB值。所以在一张图片中我可以说我有20个盒子它会告诉我20个RGB值。是的,如果有20%或更多的空白区域,它会忽略那个rgb框。

您能指点我一些链接,或者让我大致了解如何做到这一点。

祝你好运

P.S。图像只是一个.jpg,背景是白色的,中间有一个项目。

更新

这是我使用impixel收集RGB的代码

px=impixel(img);        
st = num2cell(px,1);
zstup = cellfun(@sum,st); 
zred = size(px,1);         
rez = bsxfun(@rdivide,zstup,zred); 
trez=round(rez); 

我想做的是:

http://imageshack.us/photo/my-images/696/exsample.jpg/

所以像A1,A2等这样的每一个框都会在我的代码中返回像trez一样的RGB值。

因此,在我的代码中,我将 trez 数据保存在一个表中,就像在excell中说的那样220 | 23 | 34,现在,如果我这样做,我会有另一种水果

220 | 23 | 34

123 | 212 | 78

依旧......

回归自动化,A7和A15不会是好的RGB候选者,因为它们有超过50%的白色区域,因此所有具有20%白色的东西都将被忽略。 所以A31很好,需要保存RGB值。

所以总而言之,我会得到6个RGB值,必须像上面的例子一样自动保存。 我知道如何保存到表格中我只需要帮助收集每个框中的rgb值。

2 个答案:

答案 0 :(得分:1)

根据您的确切需求,我会看到两种解决方案:

使用impyramid(img, 'reduce'缩小图像尺寸。这样可以为您提供由原始图像的平均值组成的较小图像。然后执行您之前执行的操作以访问单个像素。根据需要重复以获得2x2,4x4,8x8或更大的“盒子”。

或者您可以使用定义一个框(或任意形状)作为1和0的矩阵,并使用regionprops函数以获取有关图像内容的信息,具体取决于包含的字段:

roi = zeros(size(img))
roi(1:10,1:10) = 1;
r = regionprops(roi, img, 'MeanIntensity')
average = r.MeanIntensity

答案 1 :(得分:0)

这是我从文件夹中的图片自动彩色抓取的完整代码。因此程序会要求您选择一个文件夹,然后您将获得一个表格,其中包含有关颜色和圆头的信息。我正在使用此代码从具有白色背景的水果中获取颜色。它独自完成所有事情。希望它可以帮到某人。

clear all;
clc;


uiwait(msgbox('Chose the folder where your pictures are kept. Click OK to continue..'));

% Opening the folder

folder = uigetdir(pwd); 
filePattern = fullfile(folder, '*.jpg');
jpegFiles = dir(filePattern);
    for k = 1:length(jpegFiles)
        baseFileName = jpegFiles(k).name;
        fullFileName = fullfile(folder, baseFileName);
        [pathstr, name, ext] = fileparts(fullFileName);
        naziv_voca=name;

        %Taking RGB color

        slika = imread(fullFileName);
        [redovi stupci RGBboje] = size(slika);
        red_ink = floor(redovi/10);
        stup_ink = floor(stupci/10);
        r = 1;
        c = 1;
        for stupac = 1 : stup_ink  : stupci
            for red = 1 : red_ink : redovi
            red1 = red;
            red2 = red1 + red_ink;
            stupac1 = stupac;
            stupac2 = stupac1 + stup_ink;
            red2 = min(red2, redovi);
            stupac2 = min(stupac2, stupci);
            crveniS = slika(red1:red2, stupac1:stupac2, 1);
            zeleniS = slika(red1:red2, stupac1:stupac2, 2);
            plaviS = slika(red1:red2, stupac1:stupac2, 3);
            crvena(r,c) = mean2(crveniS);
            zelena(r,c) = mean2(zeleniS);
            plava(r,c) = mean2(plaviS);
            r = r + 1;
                if r >redovi
                    r = 1;
                end
            end
            c = c + 1;
                if c >1
                    c = 1;
                end
            end

        RGB=[crvena,zelena,plava];
        bijela=[255 255 255];
        tolerancija = 50;
        rez = RGB((abs(RGB(:,1)-bijela(1)) > tolerancija) | (abs(RGB(:,2)-bijela(2)) > tolerancija),:);
        trez=round(rez); 


        %Taking shape

        pic = rgb2gray(slika);
        threshold = graythresh(pic);
        bw = im2bw(pic,threshold);
        fbw = ones(size(bw))-imfill(ones(size(bw))-bw); 
        invImg = ~fbw;
        f = bwlabel(invImg);
        S = regionprops(f,'Area','Perimeter','centroid');
        Thr=100;
        S=S([S.Area]>Thr);
        score = (min(sqrt([S.Area]),[S.Perimeter]/4)./(max(sqrt([S.Area]), [S.Perimeter]/4))).^2;
        score=max(score);

        %Inserting data into table and creating data

        if exist('tablica.mat','file')
            vel=size(trez,1);
            for z=1:vel
                s=load('tablica');
                olddata=s.data;
                temp=trez(z,:);
                dataCell= [naziv_voca,num2cell(temp),num2cell(score)]; 
                data=[olddata;dataCell];
                save('tablica.mat','-append','data');
            end
        else
            stupac_rgb = num2cell(trez,1);
            zstupac = cellfun(@sum,stupac_rgb); 
            zred = size(trez,1);           
            rez = bsxfun(@rdivide,zstupac,zred); 
            trez=round(rez);
            data= [naziv_voca,num2cell(trez),num2cell(score)];
            save('tablica','data')
        end 

    end  
    uiwait(msgbox('Your information is saved'));