图像处理:数黑色格子-基于Java语言的open cv应用
- 1.实验要求
- 2.实验步骤
- 3.有参考意义的书籍
- 4.实验心得
这是本学期我们开设的专业实训课程的作业,任务要求主要是实现:完成一幅方块图像的打开和显示,并统计其中的黑色方块数量,现在特把其完成过程中的心得进行整理。
1.实验要求
- 能够读取任何格式的图片文件
- 能读取出来该图片文件的像素点
- 能对图片进行二值化和灰度化的预处理,进而提高角点检测的精确度
- 将图片转换为0/1矩阵
- 实现数黑色格子的功能
2.实验步骤
1.图片的处理
对图片的处理首先是要实现能够读取各个格式的图片文件,然后就是要分析像素点数据,对图片进行颜色识别,之后将图片转换为0/1矩阵,如果是基于open cv,那么就可以在灰度化以及二值化的处理过后,将图片变成只有黑白的数据,然后对处理后得到的图片进行角点检测从而便于之后的数黑色方块的算法实现,具体流程如下图所示:
2.数黑格子以及图片的显示
这一版块主要要实现数格子的算法实现并将结果以及图片借助Swing显现出来 ,具体流程如下图所示:
3.有参考意义的书籍
Java API
《数字图像处理:Java语言算法描述》-清华大学出版社
《Java核心技术I卷》-机械工业出版社
《王者归来:OpenCV3Java使用开发手册》
4.实验心得
1.如何解决正确读取不同格式的图片,如:JPEG、PNG、BMP等?
我们采用的解决办法是使用ImageIO类,因为它会根据文件的扩展名和开头的“幻数”,选择一个合适的读取器
2.用getRGB(i,j)获取颜色值并将其打印输出发现不是常见的RGB三原色格式,解决办法:
查询getRGB(i,j)发现其输出的颜色值是ARGB,但其实在实际应用中我们使用的是RGB,所以我们使用& 0xFF的操作将ARGB转化成RGB,即bufImg.getRGB(i, j) & 0xFF
3.在使用open cv的时候,程序报错:java.lang.UnsatisfiedLinkError,解决办法:
程序开始第一行加上:System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
原来使用open cv必须要首先加载open cv所需要的dll文件。
4.我们想使用open cv里的Highgui包将角点检测的结果直接窗体显现出来,但是一直显示引入失败
原因:OpenCV-3.0版本的库中没有opencv.highgui.Highgui这个包了,而且imshow(Mat m, string window)这个方法在Java中被舍去掉了
解决办法:重新去open cv的官网下载4.0.0以上的版本,并且重新搭建jar包
5.在使用open cv的方向去写的时候,打印输出转换的0/1矩阵,发现个别像素点存在着差错,一堆1里面出来了个别的0,解决办法:
对其进行降噪,降噪的作用就是在出现一堆黑点里面有极个别的白点,它会将白色的也改为黑色的。