Open CV 图像处理基础:(七)学习 OpenCV 的图像增强和边缘检测功能

在Java中学习使用 OpenCV 的图像增强和边缘检测功能

目录

  • 在Java中学习使用 OpenCV 的图像增强和边缘检测功能
    • 前言
    • 图像增强功能
      • 对比度调整(Core.addWeighted())
        • 函数原型:
        • 参数说明:
        • 代码:
        • 示例
      • 直方图均衡化(Imgproc.equalizeHist())
        • 函数原型:
        • 参数说明:
        • 代码:
        • 示例
    • 边缘检测功能
      • Canny 边缘检测(Imgproc.Canny())
        • 函数原型:
        • 代码:
        • 示例
    • 总结
    • Open CV 专栏导航

前言

OpenCV(开放源代码计算机视觉库)是一个广泛用于图像处理和计算机视觉任务的开源库。它提供了丰富的功能,包括图像增强和边缘检测等。在Java中使用OpenCV可以帮助我们对图像进行各种处理,并提取出图像的重要特征。

图像增强功能

图像增强是指通过各种方法和技术改进图像的质量和视觉效果。OpenCV 提供了一些常用的图像增强函数,下面介绍两个常用函数:

对比度调整(Core.addWeighted())

对比度调整是通过改变图像的亮度增益和对比度增益来改变图像的对比度和明暗程度。在 OpenCV 中,可以使用 Core.addWeighted() 函数来实现对比度调整。

函数原型:
void addWeighted(Mat src1, double alpha, Mat src2, double beta, double gamma, Mat dst)
参数说明:
  • src1:输入图像1。
  • alpha:输入图像1的权重。
  • src2:输入图像2。
  • beta:输入图像2的权重。
  • gamma:亮度增益(常数值)。
  • dst:输出图像。
代码:
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

public class ImageEnhancement {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }
    public static void main(String[] args) {
        String old = "D:/to/image.jpg";
        String outPut = "D:/to/image_enhancement.jpg";
        // 读取图片
        Mat image = Imgcodecs.imread(old);
        
        // 创建与输入图像相同尺寸和通道数的空的 Mat 对象
        Mat emptyMat = Mat.zeros(image.size(), image.type());
        
        // 对比度调整
        Mat contrastImage = image.clone();
        Core.addWeighted(image, 1.5, emptyMat, 0, 0, contrastImage);

        // 保存修改后的图片
        Imgcodecs.imwrite(outPut, contrastImage);
    }
}

在上述代码中,我们先创建了一个与输入图像 image 相同尺寸和通道数的空的 Mat 对象 emptyMat,然后将其作为 Core.addWeighted() 函数的第三个参数传递。这样就保证了输入的两个图像具有相同的尺寸和通道数,避免了错误。

示例

在这里插入图片描述

直方图均衡化(Imgproc.equalizeHist())

直方图均衡化是一种通过重新分布图像像素值来增强图像对比度的方法。在 OpenCV 中,可以使用 Imgproc.equalizeHist() 函数来实现直方图均衡化。

函数原型:
void equalizeHist(Mat src, Mat dst)
参数说明:
  • src:输入图像。
  • dst:输出图像。
代码:
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ImageEnhancement {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }

    public static void main(String[] args) {
        String old = "D:/to/image.jpg";
        String outPut = "D:/to/image_equalizedImage.jpg";
        // 读取彩色图片
        Mat image = Imgcodecs.imread(old);

        // 将图像转换为灰度图像
        Mat grayImage = new Mat();
        Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);

        // 直方图均衡化
        Mat equalizedImage = new Mat();
        Imgproc.equalizeHist(grayImage, equalizedImage);

        // 保存修改后的图片
        Imgcodecs.imwrite(outPut, equalizedImage);
    }
}

在上述代码中,我们首先使用 Imgproc.cvtColor() 函数将彩色图像转换为灰度图像,然后再将转换后的灰度图像应用直方图均衡化。

示例

在这里插入图片描述

边缘检测功能

边缘检测是指在图像中寻找视觉边缘的过程。OpenCV 提供了多种边缘检测算法,下面介绍一个常用函数:

Canny 边缘检测(Imgproc.Canny())

Canny 边缘检测是一种经典的边缘检测算法,它能够找到图像中的强边缘。在 OpenCV 中,可以使用 Imgproc.Canny() 函数来实现 Canny 边缘检测。

函数原型:
void Canny(Mat image, Mat edges, double threshold1, double threshold2)
  • image:输入图像。
  • edges:输出的边缘图像。
  • threshold1:边缘检测的低阈值。
  • threshold2:边缘检测的高阈值。
代码:
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class EdgeDetection {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }

    public static void main(String[] args) {
        String old = "D:/to/image.jpg";
        String outPut = "D:/to/image_edges.jpg";

        // 读取图像
        Mat image = Imgcodecs.imread(old, Imgcodecs.IMREAD_GRAYSCALE);

        // Canny 边缘检测
        Mat edges = new Mat();
        Imgproc.Canny(image, edges, 50, 150);

        // 保存修改后的图片
        Imgcodecs.imwrite(outPut, edges);

        HighGui.imshow("边缘检测", edges);
        HighGui.waitKey();
    }
}

在上述代码中,我们使用 Imgcodecs.imread() 函数读取图像,并创建一个空的 Mat 对象 edges 来保存边缘检测结果。然后,我们调用 Imgproc.Canny() 函数来应用 Canny 边缘检测,其中 50 和 150 是阈值参数,用于控制边缘检测的灵敏度。最后,用窗口展示边缘检测的结果。

示例

在这里插入图片描述

总结

在本教程中,我们学习了如何在Java中使用OpenCV库进行图像增强和边缘检测。我们了解了安装和配置OpenCV库的步骤,并学习了一些常用的图像增强技术,如调整亮度和对比度、直方图均衡化和锐化。我们还学习了两种常见的边缘检测算法:Canny边缘检测和Sobel边缘检测。

希望这个教程对你有所帮助,并能够启发你在Java中使用OpenCV进行图像处理的创造力。如果你有任何问题,请随时提问。祝你成功!

Open CV 专栏导航

  • (一)Open CV 在windows环境初始化和 Java 动态库加载方式介绍
  • (二)Open CV 从基本概念到实践操作
  • (三)使用 Open CV 在 Java 中进行基本的图片缩放操作
  • (四)使用 Open CV 在 Java 中进行基本的图片模糊处理
  • (五)Java 使用 Open CV 的绘图函数
  • (六)在Java中使用 Open CV进行图片翻转和图片旋转
  • (七)学习 OpenCV 的图像增强和边缘检测功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/321670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

强化学习应用(五):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

图形化编程:开启孩子创新思维的新途径

在科技日新月异的今天,编程已经成为了一项重要的技能。然而,对于孩子们来说,传统的编程语言可能会显得过于复杂和抽象。这时,图形化编程就显得尤为重要。那么,什么是图形化编程?它对孩子有什么帮助呢&#…

web前端算法简介之字典与哈希表

回顾 栈、队列 : 进、出 栈(Stack): 栈的操作主要包括: 队列(Queue): 队列的操作主要包括: 链表、数组 : 多个元素存储组成的 简述链表:数组&…

权责发生制和收付实现制

目录 一. 权责发生制(应记制)二. 收付实现制 \quad 一. 权责发生制(应记制) 应计制就是应该记入的意思 各项收入和费用的确认应当以“实际发生”(归属期)而不是以款项的实际收付作为记账的基础。 正是有会计期间假设,才有权责发生制和收付实…

Odrive 学习系列二:将烧录工具从ST-Link V2修改为JLink

一、背景: 通过观察odrive解压后的内容,可以看到在下面配置文件及makefile文件中的配置设置的均为openOCD + stlink v2,例如makefile中: # This is only a stub for various commands. # Tup is used for the actual compilation.BUILD_DIR = build FIRMWARE = $(BUILD_DI…

【软件测试学习笔记1】测试基础

1.软件测试的定义 软件的定义:控制计算机硬件工作的工具 软件的基本组成:页面客户端,代码服务器,数据服务器 软件产生的过程:需求产生(产品经理),需求文档,设计效果图…

工业级安卓PDA超高频读写器手持掌上电脑,RFID电子标签读写器

掌上电脑,又称为PDA。工业级PDA的特点就是坚固,耐用,可以用在很多环境比较恶劣的地方。 随着技术的不断发展,加快了数字化发展趋势,RFID技术就是RFID射频识别及技术,作为一种新兴的非接触式的自动识别技术&…

【网络工程师】NAT与动态路由

一、NAT网络地址转换 1、NAT:Network Address Translations 网络地址转换 2、ip地址问题:ipv4地址严重不够用了(A、B、C类可以使用 D组播 E科研) 3、解决:把IP地址分为了公网IP和私网IP 公网IP只能在公网上使用 私网…

探索数据之美:深入Seaborn的数据可视化艺术与技巧【第26篇—python:Seaborn】

文章目录 1. 引言2. Seaborn基础2.1 安装和环境设置2.2 常用数据可视化函数2.3 设置样式和颜色主题 3. 数据准备与导入3.1 使用Pandas库加载和处理数据3.2 数据清理和缺失值处理 4. Seaborn中的常见图表4.1 折线图和散点图:展示趋势和变量关系4.2 条形图和箱线图&am…

把模板作为元函数参数传递。

C模板元编程是一种典型的函数式编程,函数在整个编程体系中处于核心的地位。 这里的函数与一般C程序中定义的函数有所区别,其更接近数学意义上的函 数——是无副作用的映射或变换:在输入相同的前提下,多次调用同一个函数&…

命令行登录Mysql的详细讲解

目录 前言1. 本地登录2. 远程登录3. 拓展 前言 对于命令行登录Mysql一般都是用mysql -u root -p 但对于如何远程登陆,一直其他的参数还是有些盲区,对此总结科普 对于登录过程中出现的问题,可看我之前的文章: 服务器 出现ERROR …

[牛客周赛复盘] 牛客周赛 Round 28 20240114

[牛客周赛复盘] 牛客周赛 Round 28 20240114 总结A\B1. 题目描述2. 思路分析3. 代码实现 小红的炸砖块1. 题目描述2. 思路分析3. 代码实现 小红统计区间(easy)1. 题目描述2. 思路分析3. 代码实现 小红的好数组1. 题目描述2. 思路分析3. 代码实现 小红统…

鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码)

本文介绍一个基于鸿蒙ArkTS开发的App,是一个包含轮播图、文章列表和 Web 页面等功能的多页面应用。 本文主要内容包括: 一、效果图 首页 详情页 二、内容简介 1.底部Tab栏和两个页面 App底部是一个TabBar,点击TabBar可以切换上面的页面。共…

java多线程(并发)夯实之路-CAS原理与应用深入浅出

CAS:保护共享资源的无锁实现 CAS CompareAndSet,简称CAS(也有Compare And Swap的说法),它是原子的 它会将pre即之前的值和最新值进行比较,如果相同,修改为next,不同则修改失败 …

Python超详细基础文件操作(详解版)

一、文件操作 1. 文件打开与关闭 1.1 打开文件 在Python中,你可以使用 open() 函数来打开文件。 以下是一个简单的例子: # 打开文件(默认为只读模式) file_path example.txt with open(file_path, r) as file:# 执行文件操作…

M-VAE

Word2Vec c(y) 辅助信息 作者未提供代码

golang 反序列化出现json: cannot unmarshal string into Go value of type model.Phone

项目场景: 今天在项目公关的过程中,需要对interface{}类型进行转换为具体结构体 问题描述 很自然的用到了resultBytes, _ : json.Marshal(result),然后对resultBytes进行反序列化转换为对应的结构体err : json.Unmarshal(resultBytes, &…

通俗易懂实现功能强大的实战项目 springboot+java+vue+mysql 膳食营养健康网站

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

idea2020.1 x64实现git的push

今天还有点时间,顺便写一下这个。 我这边只说一下远程仓库(gitee)的push 点击之后会弹出 点击,弹出 输入你定义的远程仓库名(自己起),以及url,url由下面获取 在你的gitee创建好仓库…

【NI国产替代】PXIe‑6375,208路AI(16位,3.8 MS/s),2路AO,24路DIO,PXI多功能I/O模块

PXIe,208路AI(16位,3.8 MS/s),2路AO,24路DIO,PXI多功能I/O模块 PXIe‑6375提供了模拟I/O、数字I/O和四个32位计数器/定时器,用于PWM、编码器、频率、事件计数等应用。 该设备利用高吞…