1

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

你能给我一些链接或给我一个大致的想法如何做到这一点。

最好的祝福

PS图像只是一个.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数据保存在一个表格中,就像在excel中让我们说220 | 23 | 34,现在如果我对另一个水果这样做,我将拥有

220 | 23 | 34

123 | 212| 78

等等...

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

所以总而言之,我将拥有 6 个 RGB 值,这些值必须像上面的示例一样自动保存。我知道如何保存到表中,我只需要帮助来收集每个盒子中的 rgb 值。

4

2 回答 2

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
于 2012-09-19T11:56:36.527 回答
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'));
于 2013-02-07T11:01:36.520 回答