在MATLAB中选择颜色范围内的像素

时间:2014-07-29 05:16:30

标签: matlab image-processing colors

我正在开展一个项目,该项目包括使用相机检测电子元件是否已经焊接。程序必须能够在PLC请求时触发快照,对其进行分析并将通过/失败标志发送回plc。

作为一名MATLAB工作人员,我一直在寻找相关信息,以了解它是否可行并了解从哪里开始。

我的想法是计算在定义的区域中有多少像素具有银色或金色调。如果它主要是金,则意味着它没有被焊接。

我的问题是,如何获取网络摄像头图像区域内定义范围内颜色的像素数?

我已经找到了这个,但它是一个确切的颜色而不是一个范围。

count = sum(im(:,:1)== 255& im(:,:3)== 255& im(:,:,3)== 255);

3 个答案:

答案 0 :(得分:1)

最后,我使用了我发布的功能但使用了一个感兴趣的小区域。

我需要在黄色区域画一个正方形,有什么建议吗?

我附上代码以便有一些反馈(我不知道如何附加它,也许你不会看到它)。评论是加泰罗尼亚语,但你不会理解我所做的事情。

谢谢大家!

clear all
clc

info = imaqhwinfo('winvideo')           %Defineix origen de video
dev=info.DeviceInfo
vid=videoinput('winvideo',1)

vid.ROIPosition=[200 300 355 400];      %Zona a analitzar [iniciX, iniciY, ampladaX,
                                        alçadaY]
vid.FramesPerTrigger=5;                 %Millora la qualitat de la foto
src.Sharpness=5;

img=getsnapshot(vid);                   %Dispara foto


count = sum((img(:, :, 1) >= 150 & img(:, :, 1) <= 255) & (img(:, :, 2) >= 100 & img(:,
:, 2) <= 255) & (img(:, :, 3) >= 0 & img(:, :, 3) <= 100));
numP=sum(count(1,:))                    %Nombre de píxels en el rang de color donat
                                        %ARA DETECTA GROC/DAURAT

dimT=size(img(:,:,1));                  %Nombre de píxels total en la imatge
numT=dimT(1)*dimT(2)

Percentatge=numP/numT*100               %Percentatge de color en la imatge

%Hold on 
%Draw square
%imshow(img)
%Hold off

答案 1 :(得分:0)

以下是两种在预定义颜色范围内拾取像素的方法。

  1. 仅在HSV空间中比较色调。所以“黄金”被视为“黄色”,而“银”应该是“灰色”(但“灰色”不是色调)。如果焊料真的是“灰色”,则可能不准确,因此很难说出它的色调。
  2. 通过计算RGB空间中的欧几里德距离。更容易思考,并且可能更强大地解决“灰色”问题。
  3. _

    clear;clc;close all
    I_rgb = imread('peppers.png');
    figure(1)
    imshow(I_rgb)
    
    % hue distance in HSV space
    I_hsv = rgb2hsv(I_rgb);
    red_h = 358/360; % (normalized) hue for the red color
    O_select = abs(I_hsv(:,:,1)-red_h)<=.05;
    figure(2)
    imshow(O_select)
    O_hsv = I_hsv;
    O_hsv(:,:,2) = O_hsv(:,:,2).*O_select;
    O_rgb = hsv2rgb(O_hsv);
    figure(3)
    imshow(O_rgb)
    
    % Euclidean distance in RGB space
    red_rgb = reshape([188;28;38],[1,1,3]); % rgb coordinates for the red color
    O_distance = sqrt(sum(bsxfun(@minus, double(I_rgb), red_rgb).^2, 3));
    O_select = O_distance < 50;
    figure(4)
    imshow(O_select);
    O_hsv = I_hsv;
    O_hsv(:,:,2) = O_hsv(:,:,2).*O_select;
    O_rgb = hsv2rgb(O_hsv);
    figure(5)
    imshow(O_rgb)
    

    您可以定义多种颜色进行选择,并使用or之类的内容将多个O_select组合到最终结果中。

答案 2 :(得分:0)

不需要昂贵的MATLAB,你可以在免费且可用的ImageMagick中轻松完成这项工作here

所以,基本上你使用这个命令:

convert yourpicture.jpg -colorspace rgb -colors 256 -depth 8 txt:

它为您提供了所有像素及其值的列表:

# ImageMagick pixel enumeration: 32,32,255,rgb
0,0: (255,255,0)  #FFFF00  rgb(255,255,0)
1,0: (255,255,0)  #FFFF00  rgb(255,255,0)
2,0: (255,255,0)  #FFFF00  rgb(255,255,0)

然后你可以摆脱所有多余的东西,只需看看这样的RGB值:

convert yourimage.jpg -colorspace rgb -colors 256 -depth 8 txt: | \
   awk -F'[()]' '/^[0-9]/{print $4}'  | \
   awk -F, '{R=$1;G=$2;B=$3; print R,G,B}'

示例输出

0 255 255
0 255 255
8 156 8
8 156 8
0 55 0
0 55 0
0 55 0
8 156 8

以上代码将拍摄您的图像,无论是JPEG还是PNG还是TIFF,并列出所有像素的所有RGB值。

如果我们现在假设黄金是RGB 255,215,0,我们可以这样做:

# Find gold pixels +/- fuzz factor of 25
#
convert yourpicture.jpg -colorspace rgb -colors 256 -depth 8 txt: | \
   awk -F'[()]' '/^[0-9]/{print $4}'  | \
   awk -F, 'BEGIN {gold=0}
            {R=$1;G=$2;B=$3; if((R>230) && (G>190) && (G<240) && (B<25))gold++}
            END {print "Gold pixels found: ",gold}'

如果你想使用色调/饱和度和值,你可以在ImageMagick中同样这样做:

# Find gold pixels +/- fuzz Hue=14
#
convert yourpicture.jpg -colorspace hsv -depth 8 txt:| \
   awk -F'[()]' '/^[0-9]/{print $4}'  | \
   awk -F, 'BEGIN {gold=0}
            {H=$1; if((H>11)&&(H<16))gold++}
            END {print "Gold pixels found: ",gold}'

我应该指出Hue的范围是0-360,所以如果我们搜索14(+/-模糊),我们正在寻找360%的14%的色调,即Hue = 50,这对应于黄金。

如果要显示选择和计算的像素,可以执行以下操作:

convert pcb.jpg -channel R -fx "hue>0.09&&hue<0.11?1:0" -separate -background black -channel R -combine pcb_gold.jpg

,给定此输入图像,将产生此结果:

enter image description here enter image description here

比上述更容易,这个小脚本可以满足您的所有需求!

#!/bin/bash

# Define our gold colour
#
gold="rgb(255,215,0)"

# Convert all pixels in the image that are gold +/-35% into red. Write output to "out.jpg"
# ... and also in text format so we can count the red pixels with "grep -c"
convert pcb.jpg -fuzz 35% -fill red -opaque "$gold" -depth 8 -colorspace rgb -write txt: out.jpg | grep -c FF0000

生成此图像,黄金像素数为1076。

enter image description here