Java 对二值化图片识别连通域

用Java 对 已经 二值化了的图片 标记连通域

每块的连通域都标记不一样的数字

 1     public static void main(String [] args) throws IOException {
 2         //二值化
 3         BufferedImage image = ImageIO.read(new File("F:/MyCode/LianTongYu/specialGray.jpg"));
 4         int w = image.getWidth();
 5         int h = image.getHeight();
 6
 7         int rgb = image.getRGB(0, 0);
 8         int arr[][] = new int[h][w];
 9                  // 获取图片每一像素点的灰度值
10                  for (int i = 0; i < h; i++) {
11                          for (int j = 0; j < w; j++) {
12                                  // getRGB()返回默认的RGB颜色模型(十进制)
13                               //  arr[i][j] = image.getRGB(i, j) == -1 ?0 : 1 ;//该点的灰度值
14                              int tmp= image.getRGB(j, i);
15                              arr[i][j] =tmp==-1? 0:1;
16                              }
17                     }
18         int res=getCount(arr);
19         System.out.println(res);
20     }
21
22     public static int getCount(int[][] A) {
23         int result = 0;
24         for (int i = 0; i < A.length; i++) {
25             for (int j = 0; j < A[0].length; j++) {
26                 if (A[i][j] == 1) {
27                     result++;
28                     erase(A, i, j,result+1);
29                 }
30             }
31         }
32
33         // 统计数值
34         int arrsum[] = new int [result+2];
35         // 读取矩阵
36         for (int i = 0; i < A.length; i++) {
37             for (int j = 0; j < A[0].length; j++) {
38                 if(A[i][j]!=0)
39                 arrsum[A[i][j]]+=1;
40                System.out.print(A[i][j]+" ");
41                 }
42                 System.out.println();
43             }
44
45             //输出统计的数值
46         for (int i = 0; i < arrsum.length; i++) {
47             System.out.println(arrsum[i]);
48         }
49
50         return result;
51     }
52
53     public static void erase(int[][] A, int i, int j,int res1) {
54         A[i][j] = res1;
55         while (i - 1 >= 0 && A[i - 1][j] == 1) {
56             erase(A, i - 1, j,res1);
57         }
58         while (i + 1 < A.length && A[i + 1][j] == 1) {
59             erase(A, i + 1, j,res1);
60         }
61         while (j - 1 >= 0 && A[i][j - 1] == 1) {
62             erase(A, i, j - 1,res1);
63         }
64         while (j + 1 < A[0].length && A[i][j + 1] == 1) {
65             erase(A, i, j + 1,res1);
66         }
67
68     }
69 }

图片:

结果:

@[email protected]

原文地址:https://www.cnblogs.com/zdmein/p/8206526.html

时间: 2024-11-05 19:41:24

Java 对二值化图片识别连通域的相关文章

python图片二值化提高识别率

import cv2from PIL import Imagefrom pytesseract import pytesseractfrom PIL import ImageEnhanceimport reimport string def createFile(filePath,newFilePath): img = Image.open(filePath) # 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度. Img = img.conver

基于Java对图片进行二值化处理

一直以来对Java的图形处理能力表无力,但好像又不是那么一回事,之前用PHP做过一些应用,涉及到验证码的识别,其中有个图片二值化的步骤,今天换成Java来实现下 在java的扩展包javax.imageio中为我们提供了一个类叫ImageIO,这个类提供了一些执行简单编码和解码的静态便捷方法,具体说明大家可以翻下API看看 下面来说下关于图片二值化的原理: 1.首先要获取每个像素点的灰度值. 2.定义一个阀值. 3.将每个像素点的灰度值和它周围的8个像素点的灰度值相叠加再除以9,然后和阀值进行比

atitit.验证码识别step4--------图形二值化 灰度化

atitit.验证码识别step4--------图形二值化 灰度化 1. 常见二值化的方法原理总结 1 1.1. 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于127的像素值设为255(白色). 1 1.2. 方法二:最常见的二值处理方法是计算像素的平均值K, 2 1.3. 方法三:使用直方图方法来寻找二值化阈值, 2 1.4. 方法四:使用近似一维Means方法寻找二值化阈值,(推荐) 3 2. 使用类库imagei

OpenCV二值化cvThreshold和自适应二值化cvAdaptiveThreshold及Otsu

阈值化函数: double cvThreshold(constCvArr* src, CvArr* dst, double threshold, double max_value,int threshold_type) 参数:   src –原始数组 (单通道 , 8-bit of 32-bit 浮点数). dst –输出数组,必须与 src 的类型一致,或者为 8-bit. thresh –阈值. max_value –使用 CV_THRESH_BINARY 和 CV_THRESH_BINAR

机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的文本str格式,loc表示文本在图中的位置,font_size可以使用cv2.FONT_HERSHEY_SIMPLEX, font_scale表示文本的规格,color表示文本颜色,linestick表示线条大小 信用卡数字识别: 信用卡      数字模板涉及到的内容:主要是采用模板匹配的思想 思

验证码识别之二值化

前言 二值化顾名思义就是将数变成两种值,一般非0即1.而在验证码处理中,如果直接使用灰度图,那么每个像素的值会在0-255,这样肯定会增加计算时间,而二值化后每个像素的值只是0和1. 在前面的简单验证码识别中,我的二值化代码是这样写的:a = (a > 180) * 255,至于这里为什么不乘1而乘255,因为我要显示图片看看效果.如果只是用于算法识别的话,乘1会更好.但是,这里的180也就是二值化的阈值是如何得到的,开始是通过一个一个试然后看效果哪个好就选哪个,因为我们一般只识别某个网站的验证

c#实现图片二值化例子(黑白效果)

C#将图片2值化示例代码,原图及二值化后的图片如下: 原图: 二值化后的图像: 实现代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 7

验证码图片二值化问题 BitmapData 怎么解决

对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色的小点点呢?原来都是没有的-- 谁能帮我看看代码怎么改!谢谢大牛们帮忙!! Bitmap bit1 = new Bitmap(bit); Rectangle rect1 = new Rectangle(0, 0, bit1.Width, bit1.Height); BitmapData bitd =

opencv 删除二值化图像中面积较小的连通域

对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域. 代码 CvSeq* contour = NULL; double minarea = 100.0; double tmparea = 0.0; CFileDialog dlg(true); if (dlg.DoModal()==IDOK) { CvMemStorage* storage = cvCreateMemStorage(0); IplImage* img_src= cvLoadImage(