我需要一些图像中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值。
答案 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'));