0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析Java中的图像处理操作

jf_78858299 来源:深度学习与计算机视觉 作者:磐怼怼 2023-02-08 15:10 次阅读

我们将在本文中介绍以下高级图像处理操作:

Canny 边缘检测 :Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年开发的。它是一个多阶段算法,我们将按如下方式经历每个阶段:

  1. 噪声抑制: 第一步是使用高斯平滑从图像中去除噪声,这涉及使用高斯核,其中靠近核中心的像素被赋予比远处像素更多的权重。
  2. 梯度计算 :应用Sobel 滤波器计算图像的梯度以计算边缘强度和方向,该滤波器突出显示 x 和 y 轴上的强度变化。
  3. Non-Maximum Suppression: Non-Maximum Suppression通过遍历上一步生成的梯度矩阵中的所有值来寻找边缘方向强度更大的像素,从而减少边缘的厚度。
  4. 双阈值滞后: 最后一步使用输入参数下阈值和上限阈值来过滤掉潜在边缘,根据以下标准丢弃不相关的边缘:

如果像素梯度值高于上限阈值,则像素被接受为边缘。

如果像素梯度值低于下限阈值,则像素被拒绝。

如果像素梯度值介于两个阈值之间,则仅当它连接到高于阈值上限的像素时才会被接受。

ImgProc类为 Canny 边缘检测提供了一个Canny方法,该方法采用以下参数:

  • Source Image: Mat
  • Output edges: Mat
  • Lower Threshold: double
  • Upper Threshold: double

public static Mat cannyEdges(Mat img){
Mat canny = new Mat();
Imgproc.Canny(img,canny,30,100);
return canny;
}

Canny 边缘检测

图片

原始图像

图片

Canny 边缘检测

图片

双边滤波图像上的 Canny 边缘检测

注意:Canny 边缘检测算法基于梯度,因此对图像噪声高度敏感。因此,在灰度图像上应用 Canny 边缘检测是一种很好的做法。

**轮廓:**轮廓可以定义为连接沿边界具有相同强度的所有连续点的曲线。它们对于形状分析和对象检测很有用。

使用二值图像查找轮廓是一种很好的做法。二值图像是这样的图像,其中每个像素只能有两个可能的强度值(0 表示黑色,1 或 255 表示白色)。

ImgProc 类提供了一种用于生成二值图像的阈值方法,该方法使用以下参数:

  • Source Image: Mat - grayscale image
  • Output Image: Mat
  • Threshold : double: 如果像素值小于阈值,则设置为 0。
  • Maximum:双精度 - 分配给超过阈值的像素的最大值。
  • Type of threshold:int - OpenCV 提供不同类型的阈值技术,如 OTSUTOZERO等。

public static Mat convertToBinary(Mat img){
Mat binImg = new Mat();
Imgproc.threshold(img,binImg,125 ,255,Imgproc.THRESH_BINARY);
return binImg;
}

图像转换为二进制

图片

二进制图像

寻找轮廓:ImgProc 类提供了一个findContours方法,该方法接受以下输入参数:

  • Image:Mat - 二进制图像
  • Contours : List- 检测到的轮廓存储在这个列表中
  • Hierarchy : Mat - 存储有关图像拓扑的信息
  • Contour Retrieval Mode:int - OpenCV 提供以下检索模式:
    • RETR_LIST(0) :检索所有轮廓而不保持层次关系。
    • RETR_EXTERNAL(1): 仅检索所有极端外轮廓。
    • RETR_CCOMP(2): 检索所有轮廓并将它们排列到 2 级层次结构中。对象的外部轮廓放置在层次 1 中,对象内部的孔的轮廓放置在层次 2 中。
    • RETR_TREE(3): 检索所有轮廓并创建完整的层次结构列表。
  • Contour Approximation Method : int - 近似方法指定存储边界坐标的方式。
    • CHAIN_APPROX_NONE: 存储所有边界点。
    • CHAIN_APPROX_SIMPLE :去除冗余点并压缩轮廓;例如:对于一条线,存储两个端点。

public static void findAndDrawContours(Mat binImg,Mat org){
List contourList = new ArrayList();
Imgproc.findContours(binImg,contourList,new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(org, contourList, -1, new Scalar(50, 205, 50), 2);
HighGui.imshow("Contours",org);
HighGui.waitKey();
}

查找和绘制轮廓

绘制轮廓: ImgProc 类提供了一个drawContours方法,该方法使用以下参数:

  • Image:Mat - 目标图像
  • Contour List:List< MatOfPoint>
  • Contour Index: int - 要绘制的轮廓索引,负值表示所有轮廓都已绘制。
  • Color:Scalar - 轮廓的颜色。
  • Thickness:int - 边界线的厚度。

图片

轮廓

使用轮廓进行形状检测: 我们可以使用轮廓来根据近似曲线中的周长、面积和阵列点的数量来检测形状。ImgProc 类提供了一个approxPolyDP方法,该方法返回基于轮廓的近似曲线并使用以下参数:

  • curve:MatOfPoint2f
  • approxCurve: MatOfPoint2f - 输出曲线
  • epsilon: double - Epsilon 指定近似精度。这是原始曲线与其近似值之间的最大距离,我们可以使用 ImgProc arcLength 方法(返回曲线长度或周长)进行优化。
  • closed:布尔值 - 如果近似曲线是闭合的,则为 true,否则为 false。

public static void shapeDetection(Mat binImg,Mat org){
List contourList = new ArrayList();
List selectedContours = new ArrayList<>();
Imgproc.findContours(binImg,contourList,new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
for(int i=0;i MatOfPoint2f point = new MatOfPoint2f();
point.fromList(contourList.get(i).toList());
MatOfPoint2f approxCurve = new MatOfPoint2f();
double parameter = Imgproc.arcLength(point, true);
Imgproc.approxPolyDP(point, approxCurve, parameter * 0.02, true);
long total = approxCurve.total();
//Detecting Rectangle Shape
if (total == 4) {
double area = Imgproc.contourArea(contourList.get(i));
//rectangle with area greater than 500
if(area>500)
selectedContours.add(contourList.get(i));
}
}
Imgproc.drawContours(org, selectedContours, -1, new Scalar(50, 205, 50), 3);
HighGui.imshow("Contours",org);
HighGui.waitKey();
}

使用轮廓进行形状检测

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像处理
    +关注

    关注

    26

    文章

    1225

    浏览量

    55827
  • 边缘检测
    +关注

    关注

    0

    文章

    91

    浏览量

    18105
  • 噪声抑制
    +关注

    关注

    0

    文章

    25

    浏览量

    12105
收藏 人收藏

    评论

    相关推荐

    [原创]PhotoShop图像处理实验

    的Photoshop操作功能,另外控制栏主要是控制工具栏工具的有关特性,另外控制图像的图层等等。所有的这些功能组合,能够制作出非常精彩的Photoshop图像。一、基本的
    发表于 05-10 10:39

    机器人操作系统浅析

    机器人操作系统浅析
    发表于 09-28 11:43

    Java的常用异常处理方法 java推荐

    Java,异常情况分为Exception(异常)和Error(错误)两大类,Java异常通常是指程序运行过程中出现的非正常情况,如用户输入错误、除数为零、需要处理的文件不存在、数组
    发表于 01-19 17:26

    Labview图像处理

    利用LabVIEW进行图像处理是一个非常重要的应用。在许多行业采用图像的采集和识别来进行判断、控制,使操作更加精确,具有可信度、人性化、
    发表于 11-25 22:16

    图像处理ROI和绘图是如何操作的?

    图像处理ROI和绘图的操作
    发表于 11-09 07:01

    基于Java技术的法医图像边缘检测的研究

    在医学图像中,在相对较小的区域内图像频率的陡峭变化反映了目标对象的边缘信息,基于Sobel 算子的梯度向量操作对低噪声的医学图像的边缘提取效果较好,采用
    发表于 07-30 09:23 18次下载

    浅析监控图像处理系统的软件结构

    在现在的面向计算机内存的图像处理系统里,一般采用Windows操作系统、PCI总线、单屏操作方式,而且又融合了图像通信技术。
    发表于 01-20 15:00 1522次阅读
    <b class='flag-5'>浅析</b>监控<b class='flag-5'>图像</b><b class='flag-5'>处理</b>系统的软件结构

    JAVA教程之从网络取得图像

    JAVA教程之从网络取得图像,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 5次下载

    图像处理基本算法操作

    直方图是图像处理中另一重要处理过程,它反映图像中不同像素值的统计信息。从这句话我们可以了解到直方图信息仅反映灰度统计信息,与像素具体位置没有关系。这一重要特性在许多识别类算法中直方图
    的头像 发表于 08-14 15:05 5443次阅读
    <b class='flag-5'>图像</b><b class='flag-5'>处理</b>基本算法<b class='flag-5'>操作</b>

    java教程之如何进行Java异常处理

    本文档的主要内容详细介绍的是java教程之如何进行Java异常处理
    发表于 09-28 17:16 0次下载

    图像处理教程之图像的邻域操作资料说明

    所定义的所有邻域应该具有相同的大小。邻域运算与点运算一起形成了最基本、最重要的图像处理方法。邻域操作包括两种类型:滑动邻域操作和分离邻域操作
    发表于 03-08 15:58 12次下载
    <b class='flag-5'>图像</b><b class='flag-5'>处理</b>教程之<b class='flag-5'>图像</b>的邻域<b class='flag-5'>操作</b>资料说明

    JAVA中NIO通过MappedByteBuffer操作大文件

    java io操作中通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于MappedByteBu
    的头像 发表于 05-05 23:42 3254次阅读

    FPGA中如何使用Verilog处理图像

    的完整 Verilog 代码 。 在这个FPGA Verilog项目中,一些简单的处理操作都是在Verilog中实现的,比如反相、亮度控制和阈值操作图像
    的头像 发表于 09-23 15:50 5251次阅读

    浅析换热器内漏的原因及处理工艺

    浅析换热器内漏的原因及处理工艺
    发表于 02-11 10:51 1次下载

    java实时图像处理库教程演示

    项目介绍 项目名称:cv4j 所属系列:openharmony的第三方组件适配移植 功能:CV in Java,纯 java 实时图像处理库 项目移植状态:主功能完成 调用差异:无
    发表于 03-23 09:19 2次下载