电路板识别。

2024-06-07 00:58
文章标签 电路板 识别

本文主要是介绍电路板识别。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


分类: java   29人阅读  评论(0)  收藏  举报

电路板识别任务主要是对图形图像的处理,以前从来没有接触过这块,还好网上有好多的资源关于图像的处理。大致了解了下。学会了二值化处理图像。了解一小部分关于这块的内容,比如RGB,像素这些东西。我把图片的尺寸比如800*600先扫描一遍,然后每一个点就是一个像素它由RGB三个颜色分量组成颜色。处理的时候主要是根据这些RGB值进行处理。一幅图像就像一个大的数组,然后就是对数组里的特殊点进行处理。

下面介绍下这个简单的任务:原图是(突然发现原图太大了40多M传不上来)我就截个图吧




需求是找出图中的黑色电路部分的裂缝。 

先二值化处理,很多的二值化算法,比如大津算法,迭代算法等处理后的不是我想要的。先来看下java自带的二值化处理后的图片:




其主要代码为:

[java]  view plain copy
  1. import java.awt.image.BufferedImage;    
  2. import java.io.File;    
  3. import java.io.IOException;    
  4.     
  5. import javax.imageio.ImageIO;    
  6.     
  7. public class ImageDemo {    
  8.     
  9.     public void binaryImage() throws IOException{    
  10.         File file = new File("G://te.png");    
  11.         BufferedImage image = ImageIO.read(file);    
  12.         
  13.         int width = image.getWidth();    
  14.         int height = image.getHeight();    
  15.         
  16.         BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);//重点,技巧在这个参数BufferedImage.TYPE_BYTE_BINARY    
  17.         for(int i= 0 ; i < width ; i++){    
  18.             for(int j = 0 ; j < height; j++){    
  19.                 int rgb = image.getRGB(i, j);    
  20.                 grayImage.setRGB(i, j, rgb);    
  21.             }    
  22.         }    
  23.         
  24.         File newFile = new File("G://image//ttt.png");    
  25.         ImageIO.write(grayImage, "jpg", newFile);    
  26.     }    
  27.         
  28.     public void grayImage() throws IOException{    
  29.         File file = new File("G://process.png");    
  30.         BufferedImage image = ImageIO.read(file);    
  31.         
  32.         int width = image.getWidth();    
  33.         int height = image.getHeight();    
  34.         
  35.         BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);//重点,技巧在这个参数BufferedImage.TYPE_BYTE_GRAY    
  36.         for(int i= 0 ; i < width ; i++){    
  37.             for(int j = 0 ; j < height; j++){    
  38.                 int rgb = image.getRGB(i, j);    
  39.                 grayImage.setRGB(i, j, rgb);    
  40.             }    
  41.         }    
  42.        
  43.         File newFile = new File("G://test16.png");    
  44.         ImageIO.write(grayImage, "png", newFile);    
  45.     }    
  46.         
  47.     public static void main(String[] args) throws IOException {    
  48.         ImageDemo demo = new ImageDemo();    
  49.         demo.binaryImage();    
  50.         demo.grayImage();    
  51.    }    
  52.    
  53. }    

但是这个并不是我想要的结果,我只想得到黑色的电路其他均为白色的背景。后来我发现这个图的特点,就是它的RGB分量占的不一样。尤其是blue分量,黑色的电路部分平均值小于50我利用这个值进行处理图像。得到下图:



虽然不是很好,但是够用了。主要是了解下图像的处理。

代码如下:

[java]  view plain copy
  1. /** 
  2.  *二值化图片找出黑色的部分 
  3.  * 
  4.  **/  
  5.   
  6.  import java.awt.image.BufferedImage;  
  7.  import javax.imageio.ImageIO;  
  8.  import java.awt.Color;  
  9.  import java.io.File;  
  10.  import java.io.IOException;  
  11.   
  12.  public class DealPicture {  
  13.   
  14.     private BufferedImage bufferedImage = null;  
  15.     private int image_width = 0;  
  16.     private int image_heigh = 0;  
  17.     private File file = null;  
  18.   
  19.     public DealPicture(String filePath) {  
  20.         file = new File(filePath);  
  21.     }  
  22.       
  23.   
  24.     //获得BufferedImage  
  25.   
  26.     public BufferedImage getBufferedImage() {  
  27.           
  28.         BufferedImage buffer = null;  
  29.         try {  
  30.             buffer = ImageIO.read(file);  
  31.         } catch(IOException e) {  
  32.             System.out.println("读取图片发生错误");  
  33.             e.printStackTrace();  
  34.         }  
  35.   
  36.         return buffer;  
  37.     }  
  38.   
  39.     //对获得BufferedImage进行处理获取图片的所有的像素  
  40.   
  41.     public int[][] getPiexl() {  
  42.         bufferedImage = getBufferedImage();  
  43.         image_heigh = bufferedImage.getHeight();  
  44.         image_width = bufferedImage.getWidth();  
  45.         int iamge_rgb = bufferedImage.getRGB(0,0);  
  46.         System.out.println("图片的宽度是: " + image_width + "  " + "图片的高度是: " + image_heigh + "  像素点共有 " + (image_width*image_heigh));  
  47.         int[][] image_piexl = new int[image_width][image_heigh];  
  48.         for(int x = 0;x<image_width;x++) {  
  49.             for(int y = 0;y<image_heigh;y++ ) {  
  50.                 //image_piexl[x][y] = getGray(bufferedImage.getRGB(x,y));  
  51.                 image_piexl[x][y] = bufferedImage.getRGB(x,y);  
  52.             }  
  53.         }  
  54.   
  55.         return image_piexl;  
  56.     }  
  57.   
  58.     //计算每个像素的灰度值  
  59.     public int getGray(int rgb) {  
  60.         Color color = new Color(rgb);  
  61.         int r = color.getRed();  
  62.         int g = color.getGreen();  
  63.         int b = color.getBlue();  
  64.         int rgb_averge = (r+g+b)/3;  
  65.         //int rgb_gray =(int)( r*30 + g*29 + b*50)/100;  
  66.         return rgb_averge;  
  67.         //return rgb_gray;  
  68.     }  
  69.   
  70.     //  
  71.     /** 
  72.      * 
  73.      * 
  74.      * 
  75.      **/  
  76.   
  77.     public void createImage() {  
  78.         int flag = 30;  
  79.         int[][] newImage = getPiexl();  
  80.         BufferedImage buff = new BufferedImage(image_width,image_heigh,BufferedImage.TYPE_BYTE_BINARY);  
  81.         Color color = null;  
  82.         for(int x = 0;x<image_width;x++) {  
  83.             for(int y = 0;y<image_heigh;y++){  
  84.                 color = new Color(newImage[x][y]);  
  85.                 int g = color.getGreen();  
  86.                 //System.out.println("处理后的像素点灰度是: " + newImage[x][y]);  
  87.                   
  88.                 //if(Math.abs((newImage[x][y]-flag))<5 && newImage[x][y]<35) {  
  89.                 if(g<52) {  
  90.                     int min_rgb = new Color(0,0,0).getRGB();  
  91.                     buff.setRGB(x,y,min_rgb);  
  92.                     flag = newImage[x][y];  
  93.                       
  94.                 }   
  95.                 else {  
  96.                     int max_rgb = new Color(255,255,255).getRGB();  
  97.                     buff.setRGB(x,y,max_rgb);  
  98.                       
  99.                 }  
  100.                   
  101.   
  102.                 //测试生成一副灰度图像  
  103.                 //buff.setRGB(x,y,newImage[x][y]);  
  104.                   
  105.             }  
  106.         }  
  107.         try{  
  108.             ImageIO.write(buff, "png"new File("G://image//text4.png"));   
  109.         } catch(IOException e) {  
  110.             System.out.println("生成图片失败");  
  111.             e.printStackTrace();  
  112.         }  
  113.     }  
  114.   
  115.       
  116.   
  117.     public static void main(String[] args){  
  118.         DealPicture deal = new DealPicture("G://Image2.png");  
  119.         deal.createImage();  
  120.     }  
  121.  }  
最后就是找裂缝了:最终图像如下(红色部分为裂缝):




这个任务历时三天,主要是接触下图像的处理,当然这个是处理的很不好的,就当学习下了

开始截的图穿不上来就从新搞下:


这篇关于电路板识别。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037733

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

Clion不识别C代码或者无法跳转C语言项目怎么办?

如果是中文会显示: 此时只需要右击项目,或者你的源代码目录,将这个项目或者源码目录标记为项目源和头文件即可。 英文如下:

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN:在生物医学自然语言处理中,NER和NEN是关键任务,它们使得从生物医学文献中自动提取实体(如疾病和药物)成为可能。 BERN2:BERN2是一个工具,

行为智能识别摄像机

行为智能识别摄像机 是一种结合了人工智能技术和监控摄像技术的先进设备,它能够通过深度学习算法对监控画面进行实时分析,自动识别和分析监控画面中的各种行为动作。这种摄像机在安防领域有着广泛的应用,可以帮助监控人员及时发现异常行为,并采取相应的措施。 行为智能识别摄像机可以有效预防盗窃事件。在商场、超市等公共场所安装这种摄像机,可以通过识别异常行为等情况,及时报警并阻止不安全行为的发生

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题 GitHub Pages是一个直接从GitHub存储库托管的静态站点服务,‌它允许用户通过简单的配置,‌将个人的代码项目转化为一个可以在线访问的网站。‌这里使用flutter build web来构建web发布到GitHub Pages。 最近通过flutter build web,通过发布到GitHu

T1打卡——mnist手写数字识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.定义GPU import tensorflow as tfgpus=tf.config.list_physical_devices("GPU")if gpus:gpu0=gpus[0]tf.config.experimental.set_memort_groth(gpu0,True) #设置GPU现存用量按需

使用 VisionTransformer(VIT) FineTune 训练驾驶员行为状态识别模型

一、VisionTransformer(VIT) 介绍 大模型已经成为人工智能领域的热门话题。在这股热潮中,大模型的核心结构 Transformer 也再次脱颖而出证明了其强大的能力和广泛的应用前景。Transformer 自 2017年由Google提出以来,便在NLP领域掀起了一场革命。相较于传统的循环神经网络(RNN)和长短时记忆网络(LSTM), Transformer 凭借自注意力机制

T7:咖啡豆识别

T7:咖啡豆识别 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型**1、手动搭建2、直接调用官方模型 **四、编译模型****五、训练模型****六、模型评估****七、预测**八、暂时总结 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K

mysql无法启动以及cmd下mysql命令无法识别的

1.mysql无法启动 解决方式: Win+R,输入services.msc,找到mysql服务 即默认的服务名是mysql55而不是mysql 2.mysql命令无法识别 直接输入mysql进入数据库报错 这是因为系统并不知道mysql是什么,我们需要在环境变量里添加mysql的安装地址中的bin目录地址。 C:\Program Files\My

Selenium 实现图片验证码识别

前言 在测试过程中,有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试,怎么做图片验证码识别?本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk:1.8 tessdata:文章末尾附下载地址 安装Tesseract 我本地是ubuntu系统 sudo apt install tesserac