大家好,又见面了,我是你们的朋友全栈君。
因生产需要计算图像的面积,首先第一步就是要先将图像中有洞的地方给它填上,网上找了半天说是matlab中的imfill算法就能直接填上,但我对matlab也不熟也不想用它,结果网上搜资料看看到很多C 的博主写的可以直接用opencv搞定,我一想opencv能搞定那肯定javacv也能搞,所以就有了下面的内容。
废话不多说直接上代码
代码语言:javascript复制 public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat src = Imgcodecs.imread("C:\Users\Administrator\Desktop\aa20040113285386.jpg", Imgcodecs.IMREAD_GRAYSCALE);
Mat out_th = new Mat();//二值化后的图像
Imgproc.threshold(src, out_th, 220, 255, Imgproc.THRESH_BINARY_INV);//灰度图像二值化
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\out_th.jpg", out_th);
Size lagerSize = new Size();//这里的mat要比原图周围大一个像素,这里是重点
lagerSize.height = out_th.height() 2;
lagerSize.width = out_th.width() 2 ;
Mat lager = Mat.zeros(lagerSize,out_th.type());
Mat lager1 = lager.rowRange(1,out_th.rows() 1).colRange(1,out_th.cols() 1);//将图片复制到大图的中间,
out_th.copyTo(lager1);
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\lager.jpg", lager);
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\lager1.jpg", lager1);
Mat newMat = out_th.clone();
Imgproc.floodFill(newMat,lager,new Point(0,0),new Scalar(255));//漫水填充法填充 从0,0开始,有空洞的地方用255代替
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\lager_1.jpg", lager);
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\lager1_1.jpg", lager1);
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\out_th_1.jpg", out_th);
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\newMat.jpg", newMat);
Mat inv_ = new Mat();
Core.bitwise_not(newMat,inv_);//二值化图像取反
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\inv_.jpg", inv_);
Mat or_ = new Mat();
Core.bitwise_or(inv_,out_th,or_);//二值图像按位或
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\or_.jpg", or_);
Mat or_inv = new Mat();
Core.bitwise_not(or_,or_inv);//二值图像取反
Imgcodecs.imwrite("C:\Users\Administrator\Desktop\aa\or_inv.jpg", or_inv);
}
解决思路参考:https://www.it610.com/article/1297086611263135744.htm,
思路大致:
1.先将图片进行二值化处理
2.将图片向外延伸两个像素
3.调用漫水填充法填充
4.得到的图像在做相应的处理就得到填充的图像
最后这里附上原图和最终处理后的图像,中间的图可以自己处理一下就得到了。注意各个阶段图像像素的变化。
整理后的代码:
代码语言:javascript复制/**
* 漫水填充法填补漏洞
* @param src 原图进行二值化处理后的图像
* @return 填补后输出的二值图
*/
public static Mat floodFill(Mat src){
Size lagerSize = new Size();//这里的mat要比原图周围大一个像素,这里是重点
lagerSize.height = src.height() 2;
lagerSize.width = src.width() 2 ;
Mat lager = Mat.zeros(lagerSize,src.type());
Mat lager1 = lager.rowRange(1,src.rows() 1).colRange(1,src.cols() 1);//将图片复制到大图的中间,
src.copyTo(lager1);
Mat src_clone = src.clone();
Imgproc.floodFill(src_clone,lager,new Point(0,0),new Scalar(255));//漫水填充法填充 从0,0开始,有空洞的地方用255代替
Mat src_clone_inv = new Mat();
Core.bitwise_not(src_clone,src_clone_inv);//二值化图像取反
Mat dst = new Mat();
Core.bitwise_or(src_clone_inv,src,dst);//二值图像按位或
return dst;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/194617.html原文链接:https://javaforall.cn