`

根据颜色检查图片中的产品是否合格

 
阅读更多

受朋友之托,做了一个小软件。只是一个练手,现将思路重现。

需求

模拟一工厂在生产瓶盖,机器是自动为盖子上色。在上色后,要检查瓶盖是否上色正常。

把9个瓶盖成宫形排列,并依次编号。

要求软件,给定一个其准的瓶盖图片,再给一张9个瓶盖的排列图片,判断在图片是有哪几个编号的瓶盖是没有正常上色的。

 

基准图片


 

生产图片

 


 

在软件中输入这两张图片后能显示第2和5号瓶盖有错误。

 

最终效果

 


 

 

OK,好,开始解决。

 

分析

 

  1. 判断标准

    从所给的图片分析,虽然我们人眼能一眼就看出瓶盖的大小形状和颜色,但机器并不知道。我们要确定一个判断的标准。因为从所给的图片来看,如果判断形状那太麻烦,而且我们可以看出,不同瓶盖之间的颜色差距是非常大的,那么通过颜色来判断就会容易的多。但对于颜色,我们又要再深入考虑。我们的第一反应,如果使用颜色来比较的话那就使用RGB来判断(后面会以另一种方案来实现),但颜色的组成中的值非常的敏感,同种颜色在不同光线中,甚至于同一张照片在不同的时间其RGB颜色都会有很大的差距。不过,这是一个方向,先定下,以颜色来判断,颜色不以一个点,而是以一个区域中的GRB不同颜色的范围值。

  2. 操作步骤
    选择基准图片
    缩放图片到固定尺寸(并显示在界面中)
    从基准图片中分析出颜色范围
    选择检查图片
    缩放图片到固定尺寸(并显示在界面中)
    把检查图片分割成9份
    循环判断9份的小图片的颜色是否与基准颜色相同
    输出不合格的编号(在界面中显示)

  3. 分析基准图片
    从图片中可以看出,并不是一张纯色的图片,根据实际情况,我们将选择图片中的内切矩形中的点来综合判断,为快速测试,先用取色器取出RGB颜色,大约B在170以上,R在60以下,G在120左右(后面会发现这种判断真是惨不忍睹)。

  4. 分析判断切割后的小图片
    切割后的图片中的瓶盖位置应该和基准图中的位置差不多,除非是图片拍歪了。要判断是否相同,也是只取圆中的内切矩形的一切颜色来判断。要考虑容错,就像图片中的第4和7号中间被曝光的太严重,在这两个瓶盖中肯定会有大量的白色。把容错值考虑为0.8,也就是在这个矩形中只要有80%的颜色在合格范围内就算合格。(我想当然了,后面的测试证明容错即使是0.4都很吃力)

修正错误

如果按以上的判断方法也可判断出来,但结果就是准确率很低,要求所拍的照片不能有曝光,颜色要正等等。在网上搜索了些信息,得到了另一个有用的信息。那就是HSB,对于RGB来说,颜色变一点点其值就变化的很大,但对于HSB来说,同一颜色的色相度非常的稳定,误差也不会超过0.1,在换成HSB判断后,准确率非常的高,判断时不必再用内切矩形,而是整个小图片,这时的容错值可达到70%以上,就是说在包含了小图片中后面的桌子背景的错误颜色后,它都还能有70%的点是判断正确,实在是很不错。下面就以HSB的判断为准来显示代码。

 

 

 

开始编程

先不用界面,基准图的颜色用取色器取出RGB,再换算成HSB,对应的色相度在0.5到0.6。

先创建一个类起名为Pic,把main方法中的结构做出来,测试两张不同的3*3瓶盖图片

 

    public static void main(String[] args) throws Exception {
        String path1 = Pic.class.getClassLoader().getResource("resource/1.jpg").getFile();
        String path2 = Pic.class.getClassLoader().getResource("resource/2.jpg").getFile();
        System.out.println(new File(path1).getParent());

        System.out.println("测试" + path1);
        new Pic().testPic(path1);

        System.out.println();

        System.out.println("测试" + path2);
        new Pic().testPic(path2);
    }

 

 

再来实现testPIc方法,这个方法里我们来分成几步,读取图片,缩放图片,切割图片,判断不合格图片,显示结果

 

    public void testPic(String imgPath) throws IOException {
        BufferedImage read = ImageIO.read(new File(imgPath));
        BufferedImage fixPic = fixPic(read, 350, 350);
        List<BufferedImage> list = getPicList(fixPic);
        List<Integer> indexList = getErrorPicIndex(list, 0.5f, 0.6f);

        if (indexList.isEmpty()) {
            System.out.println("测试结果:没有错误");
        } else {
            System.out.print("测试结果:编号");
            String index = "";
            for (int i = 0; i < indexList.size(); i++) {
                index += indexList.get(i) + ",";
            }
            index.substring(0, index.length() - 1);
            System.out.println(index + "错误");
        }
    }

 

 

实现缩放图片代码,这里在调用的方法里传过来宽度和高度,定的是350*350,

public BufferedImage fixPic(BufferedImage img, int height, int width) {
        Image scaledInstance = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
        BufferedImage newimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = newimg.getGraphics();
        graphics.drawImage(scaledInstance, 0, 0, null);
        graphics.dispose();

        return newimg;
    }

 

实现切割图片方法,把图片切成3*3的9个图片集合

 public List<BufferedImage> getPicList(BufferedImage img) {
        int row = 3, col = 3;

        List<BufferedImage> list = new ArrayList();
        int height = img.getHeight();
        int width = img.getWidth();

        int drow = height / row;
        int dcol = width / col;

        for (int i = 0; i < row; i++) {
            int y = i * drow;
            for (int j = 0; j < col; j++) {
                int x = j * dcol;
                BufferedImage newimg = new BufferedImage(width / 3, height / 3, BufferedImage.TYPE_INT_RGB);
                Graphics graphics = newimg.getGraphics();
                graphics.drawImage(img, 0, 0, newimg.getWidth(), newimg.getHeight(), x, y, x + dcol, y + drow, null);
                graphics.dispose();
                list.add(newimg);
            }
        }

        return list;
    }

 

实现取出不合格图片方法,注意,这里要传两个HSB的H值,也就是我们在上面判断的0.5到0.6在方法体中循环对每个图片进行合格判断

   public List<Integer> getErrorPicIndex(List<BufferedImage> list, float min, float max) {
        ArrayList indexlist = new ArrayList();
        for (int i = 0; i < list.size(); i++) {
            if (!isPass(list.get(i), min, max)) {
                indexlist.add(i + 1);
            }
        }
        return indexlist;
    }

 

实现对图片合格的判断方法,注意,这里的判断是对图片中的每一个点颜色都进行判断,包含了桌面的背景颜色,所有不可能是100%合格,所以这里fex取的是50%合格率,但在测试时发现,合格率可以高达70%以上,所以也可以设置到0.7。

 private boolean isPass(BufferedImage img, float min, float max) {
        int width = img.getWidth();
        int height = img.getHeight();

        int xbegin = 0;
        int xend = width;
        int ybginx = 0;
        int yend = height;

        int totleNo = 0, errorNo = 0;
        for (int i = xbegin; i < xend; i++) {
            for (int j = ybginx; j < yend; j++) {
                Color color = new Color(img.getRGB(i, j));

                float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null);
                if (hsb[0] >= min && hsb[0] <= max) {
                } else {
                    errorNo++;
                }
                totleNo++;
            }
        }

        double fex = ((totleNo - errorNo + 0.0) / totleNo);

        if (fex > 0.5) {
            return true;
        } else {
            return false;
        }
    }

 

好,核心的代码已经完成了。但如果对于界面来说还要一个取基准图片的色相范围的方法。

实现取基准图色相值范围,这里有个思路,怎么来取值。我这么来判断,色相都有一个很小的区间,且变化值不大,值为float类型,基本上都是在小数点后1到2位跳到。那么我把基准图上的所有点的色相值取小数点后1位的整数形,保存到相应下标的数组中,代表的也就是那个色相的小区间(因为是小数点后1位的值),那么再有一个点也是这个区间的,我就把这个数组下标对存的值自增加1。最后就能得到在不同区间中色相的存在分布,因为基准图中大部分都是蓝色,所以取分布值最大的那个数组下标,也就是蓝色所在的色相区间。误差不超过0.1

public float[] getHSBhmn(BufferedImage newImage) {
        int width = newImage.getWidth();
        int height = newImage.getHeight();

        int xbegin = 0;
        int xend = width;
        int ybegin = 0;
        int yend = height;

        float max = 0, maxindex = 0;
        int[] ints = new int[10];
        for (int i = xbegin; i < xend; i++) {
            for (int j = ybegin; j < yend; j++) {
                Color color = new Color(newImage.getRGB(i, j));
                float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null);
                ints[(int) (hsb[0] * 10)] = ints[(int) (hsb[0] * 10)] + 1;
            }
        }

        for (int i = 0; i < 10; i++) {
            if (ints[i] > max) {
                maxindex = i + 1;
                max = ints[i];
            }
 
        }

        return new float[]{(maxindex - 1) * 0.1f, maxindex * 0.1f};
    }

 

 

好了,核心代码全部完成。测试,OK。

 

再就是做界面了,这没什么好写的。用netbeans拖拖画画,简单的就搞定,再加上这个Pic类中的方法代码,一个小软件成型了。

  • 大小: 3.1 KB
  • 大小: 39.3 KB
  • 大小: 53.2 KB
0
0
分享到:
评论

相关推荐

    IPQC流程图(1).doc

    7. **最终检验与包装**:生产完成后,包装班组对每件未封箱产品进行全面检查,包括配件数量、颜色、型号、规格、说明书等。合格产品贴上《产品标示卡》送QA检验,不合格则返工并记录于《QA检验记录表》。 8. **产品...

    参考资料-86、主缆防护外观鉴定检查记录表(外观记录表8.11.10).zip

    3. **评估标准**:定义了各项检查内容的合格标准,可能包括颜色、完整性、损伤程度等方面的评级标准。 4. **检查结果**:记录每个检查项的具体情况,通过文字描述或评分来体现主缆的实际情况,与评估标准进行对比。...

    abc_为规范VQC检验流的专题报告.ppt

    通过触感和目视检查,判断产品的外观情况,如CASE的形状和尺寸是否符合规格。利用游标卡尺进行精确测量,同时检查铜柱内螺纹的完整性,必要时用扭力起子进行试锁,确保铜钉的高度在规格范围内。 电镀和喷漆附着力是...

    企业7大质量要素分析.pptx

    这些要素包括终检、自检、红料箱等,旨在通过严格的检查和反馈机制,防止不合格产品的产生和流通。 1. **终检**:终检是产品在交付客户前的最后质量把关环节,它依据控制计划设定的检查项目进行。检查项目不宜过多...

    ANSI-ASQ- Z1.4- 2003(R2018)

    例如,产品是否存在缺陷、颜色是否匹配等。 4. **紧缩、正常和放宽计划**:这三种检验计划分别对应不同的质量控制情况。紧缩计划用于控制质量下滑,正常计划为常规检验,而放宽计划则适用于质量稳定且表现良好的...

    摄像头.zip

    这通常涉及到图像处理软件,它可以增强图像,突出显示关键细节,或者与预设的标准进行比较,以判断产品是否合格。查看功能也可能是交互式的,允许用户放大、旋转或测量图像以进行更深入的分析。 综上所述,"摄像头....

    说明书质量检验表.zip

    5. 错误检查:仔细核对说明书中的文字和图片,确保无错别字、拼写错误或图片不匹配的问题。 6. 更新及时性:确保说明书与最新产品版本同步,反映最新的功能和变化。 7. 文档格式:检查文档的版式、字体、字号、颜色...

    蔬菜验收标准图片版.doc

    文档“蔬菜验收标准图片版.doc”是一份详细阐述蔬果验收规范的资料,适用于超市、餐饮业或农产品供应链中的质量控制环节。以下是该文档中提到的一些关键知识点: 1. **蔬果验收流程**: - 收货人员需按照既定的...

    敦煌网分享跨境电商如何避免与买家产生纠纷.doc

    - **清晰描述产品**:检查产品描述是否存在歧义,确保描述准确无误,不夸大其词或作虚假陈述。 - **实物与图片相符**:产品图片应真实反映实物,避免因为视觉差异引发纠纷。 - **突出关键信息**:对于可能出现...

    AOI检测仪在PCB电路板的检测与改进措施.pdf

    在PCB电路板的测试中,使用AOI检测仪时存在的问题主要包括:检测到的图片存在疑问点,这些图片需要工人再次确认是否存在缺陷。对于这些疑问图片,工人需要花费大量时间进行判断。由于人工处理时间的限制,这会导致...

    labview视觉助手VBAI药品有无检测

    5. **结果输出**:系统根据识别结果,可以触发相应的动作,如合格产品继续流动,不合格产品则被剔除或报警。同时,结果也会实时显示在操作界面上,便于操作员监控和记录。 6. **系统优化与更新**:随着时间推移,...

    求瓶盖面积_halcon_

    5. **结果验证与处理**:检查计算出的面积是否符合预期,根据实际情况进行数据记录或触发相应动作。比如,如果瓶盖面积超出预设范围,可能表示瓶盖尺寸不合格。 在这个案例中,文件名"求瓶盖面积"暗示了主要的任务...

    报名照片审核处理工具

    而"报名照片审核处理工具"则通过自动化的方式,能够快速检查照片是否符合标准,如检查照片尺寸是否为规定的尺寸(如一寸、二寸),格式是否为常见的JPG或PNG,以及像素分辨率是否达到要求。 该工具的功能通常包括:...

    验瓶机系统用于连PLC与影像外设

    整个验瓶机系统的工作流程大致为:PLC接收到VB发出的指令,启动影像设备对瓶子进行拍照,影像处理软件分析图片,结果反馈给PLC,PLC根据结果决定是否让瓶子继续通过生产线。同时,所有这些过程和数据都会被记录在...

    PDF文档-彩色喷漆分项工程质量检验评定表.zip

    3. **表面处理**:检查基层处理是否合格,包括清洁、除锈、打磨、封闭等步骤,这些都直接影响到喷漆的附着力和外观。 4. **工艺流程**:评估喷漆过程是否按照规定的技术规程操作,如涂装顺序、层数、干燥时间等。 ...

    通用产品记录表excel模版下载

    6. **质量控制**:记录产品的质量检查结果,如检验标准、检验日期、合格率等,确保产品质量符合标准。 7. **客户反馈与评价**:收集和整理客户的反馈,了解产品优点和改进之处,为产品优化提供依据。 8. **报表与...

    蔬菜验收标准图片版重点.doc

    如果抽查中发现不合格商品,将进行100%复查。 5. **质量判断**:主要通过观察商品的外观、颜色、气味等判断其品质。商品的整齐度、清洁度和成熟度至关重要,需要保鲜的蔬果应及时入库。 6. **蔬果质量标准**: - ...

    RF-GC-ZY-08-F04 材料样板确认单.zip

    在这些行业中,材料样板确认是非常关键的一步,它涉及到产品质量、成本控制以及最终产品的一致性。 "RF"可能代表“Request for”,在IT和工程项目中通常指需求或请求;"GC"可能代表"General Construction",即通用...

    Excel表格+Word文档各类各行业模板-包装组日报表.zip

    在包装行业中,日报通常用于记录每天的工作进度、生产数据、质量检查结果、异常情况以及任何其他与生产流程相关的重要信息。Excel表格可能包含了以下几类关键知识点: 1. **生产统计**:使用Excel的表格功能,可以...

Global site tag (gtag.js) - Google Analytics