opencv练习-案例

news2025/1/12 21:49:30
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

图像分割是计算机将图像分割成多个区域的过程

使用阈值分割图像,产生两个区域

打开图像文件

img = cv.imread('snake.png',cv.IMREAD_COLOR)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
b,g,r = cv.split(img)
src = cv.merge([r,g,b])
plt.subplot(121),plt.imshow(src)
plt.title('original image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(gray,cmap='gray')
plt.title('gray image'),plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述
在这里插入图片描述

plt.imshow(gray,cmap=‘gray’) - - - cmap可以赋值的值。可以改变图片的颜色
‘Accent’, ‘Accent_r’, ‘Blues’, ‘Blues_r’, ‘BrBG’, ‘BrBG_r’, ‘BuGn’, ‘BuGn_r’, ‘BuPu’, ‘BuPu_r’, ‘CMRmap’, ‘CMRmap_r’, ‘Dark2’, ‘Dark2_r’, ‘GnBu’, ‘GnBu_r’, ‘Greens’, ‘Greens_r’, ‘Greys’, ‘Greys_r’, ‘OrRd’, ‘OrRd_r’, ‘Oranges’, ‘Oranges_r’, ‘PRGn’, ‘PRGn_r’, ‘Paired’, ‘Paired_r’, ‘Pastel1’, ‘Pastel1_r’, ‘Pastel2’, ‘Pastel2_r’, ‘PiYG’, ‘PiYG_r’, ‘PuBu’, ‘PuBuGn’, ‘PuBuGn_r’, ‘PuBu_r’, ‘PuOr’, ‘PuOr_r’, ‘PuRd’, ‘PuRd_r’, ‘Purples’, ‘Purples_r’, ‘RdBu’, ‘RdBu_r’, ‘RdGy’, ‘RdGy_r’, ‘RdPu’, ‘RdPu_r’, ‘RdYlBu’, ‘RdYlBu_r’, ‘RdYlGn’, ‘RdYlGn_r’, ‘Reds’, ‘Reds_r’, ‘Set1’, ‘Set1_r’, ‘Set2’, ‘Set2_r’, ‘Set3’, ‘Set3_r’, ‘Spectral’, ‘Spectral_r’, ‘Wistia’, ‘Wistia_r’, ‘YlGn’, ‘YlGnBu’, ‘YlGnBu_r’, ‘YlGn_r’, ‘YlOrBr’, ‘YlOrBr_r’, ‘YlOrRd’, ‘YlOrRd_r’, ‘afmhot’, ‘afmhot_r’, ‘autumn’, ‘autumn_r’, ‘binary’, ‘binary_r’, ‘bone’, ‘bone_r’, ‘brg’, ‘brg_r’, ‘bwr’, ‘bwr_r’, ‘cividis’, ‘cividis_r’, ‘cool’, ‘cool_r’, ‘coolwarm’, ‘coolwarm_r’, ‘copper’, ‘copper_r’, ‘cubehelix’, ‘cubehelix_r’, ‘flag’, ‘flag_r’, ‘gist_earth’, ‘gist_earth_r’, ‘gist_gray’, ‘gist_gray_r’, ‘gist_heat’, ‘gist_heat_r’, ‘gist_ncar’, ‘gist_ncar_r’, ‘gist_rainbow’, ‘gist_rainbow_r’, ‘gist_stern’, ‘gist_stern_r’, ‘gist_yarg’, ‘gist_yarg_r’, ‘gnuplot’, ‘gnuplot2’, ‘gnuplot2_r’, ‘gnuplot_r’, 'gray', ‘gray_r’, ‘hot’, ‘hot_r’, ‘hsv’, ‘hsv_r’, ‘inferno’, ‘inferno_r’, ‘jet’, ‘jet_r’, ‘magma’, ‘magma_r’, ‘nipy_spectral’, ‘nipy_spectral_r’, ‘ocean’, ‘ocean_r’, ‘pink’, ‘pink_r’, ‘plasma’, ‘plasma_r’, ‘prism’, ‘prism_r’, ‘rainbow’, ‘rainbow_r’, ‘seismic’, ‘seismic_r’, ‘spring’, ‘spring_r’, ‘summer’, ‘summer_r’, ‘tab10’, ‘tab10_r’, ‘tab20’, ‘tab20_r’, ‘tab20b’, ‘tab20b_r’, ‘tab20c’, ‘tab20c_r’, ‘terrain’, ‘terrain_r’, ‘turbo’, ‘turbo_r’, ‘twilight’, ‘twilight_r’, ‘twilight_shifted’, ‘twilight_shifted_r’, ‘viridis’, ‘viridis_r’, ‘winter’, ‘winter_r’

图像的OTSU二值分割

otsu大津阈值法分割

通过最小化两个区域的加权方差实现图像分割

ret,thresh = cv.threshold(gray,0,255,cv.THRESH_OTSU)
plt.imshow(thresh,cmap='gray')
plt.title('otsu'),plt.axis('off')
cv.imwrite('otsu.jpg',thresh)
plt.show()

在这里插入图片描述
在这里插入图片描述

图像的canny边缘检测

标识数组图像中亮度变化明显的点

cv.Canny是一个边缘检测算法,用于检测图像中物体的边缘。它的参数包括:

  1. gray: 输入的灰度图像

  2. 100: 低阈值,任何梯度值低于该值的边缘都会被认为是不重要的,会被过滤掉。

  3. 200: 高阈值,梯度值高于该值的边缘会被认为是重要的边缘。

Canny算法会根据给定的阈值进行边缘检测,一般来说,高阈值是低阈值的三倍左右。如果一个像素梯度值超过高阈值,则认为它是一个强边缘;如果一个像素梯度值在低阈值和高阈值之间,则认为它是一个弱边缘;如果一个像素梯度值低于低阈值,则被认为是不重要的边缘,会被过滤掉。Canny算法返回的是一个二值图像,其中边缘像素值为白色,非边缘像素值为黑色。

img = cv.imread('snake.png',cv.IMREAD_COLOR)
edges = cv.Canny(gray,100,200)# 二维数组
b,g,r = cv.split(img)
src = cv.merge([r,g,b])
plt.subplot(221),plt.imshow(src)
plt.title('original image'),plt.xticks([]),plt.yticks([])
plt.subplot(222),plt.imshow(edges,cmap='gray')
plt.title('edge image'),plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述

边缘检测大图展示
在这里插入图片描述

图像的harris corner角点检测

gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
# result is dilated for marking the corners,not important
dst = cv.dilate(dst,None)
# threshold for an optimal value,it may vary depending on the image
img[dst > 0.01 * dst.max()] = [0,0,255]
b,g,r = cv.split(img)
src = cv.merge([r,g,b])
cv.imwrite('harris.jpg',src)
plt.imshow(src)

在这里插入图片描述

角点检测大图
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OmniShade - Mobile Optimized Shader

OmniShade Pro是一款专为移动设备设计的高性能着色器。它包含多种技术,使其几乎可以实现从现实到卡通到动漫的任何外观,但由于自适应系统仅计算任何功能集所需的内容,它的速度也非常快。 它旨在弥合Unity的标准着色器和移动着色器之间的差距,但由于其高级别的风格化、组合…

系统架构设计师(第二版)学习笔记----信息安全基础知识

【原文链接】系统架构设计师(第二版)学习笔记----信息系统基础 文章目录 一、信息安全的概念1.1 信息安全的基本要素1.2 信息安全的内容1.3 设备安全的内容1.4 数据安全的内容1.5 内容安全的含义1.6 行为安全的含义 二、 信息存储安全2.1 信息存储安全的…

怎么实现一个登录时需要输入验证码的功能

今天给项目换了一个登录页面,而这个登录页面设计了验证码,于是想着把这个验证码功能实现一下吧。 这篇文章就如何实现登录时的验证码的验证功能结合代码进行详细地介绍,以及介绍功能实现的思路。 目录 页面效果 实现思路 生成验证码的控制…

水仙花数(熟悉Python后再写)

CSDN问答社区的一个提问,勾起我当时写代码的烦困。 (本笔记适合熟悉一门编程语言的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是…

Vulnhub实战-DC9

前言 本次的实验靶场是Vulnhub上面的DC-9,其中的渗透测试过程比较多,最终的目的是要找到其中的flag。 一、信息收集 对目标网络进行扫描 arp-scan -l 对目标进行端口扫描 nmap -sC -sV -oA dc-9 192.168.1.131 扫描出目标开放了22和80两个端口&a…

【C语言基础】操作符、转义字符以及运算法大全,文中附有详细表格

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

【学习笔记】Java 一对一培训(第一部分)开发工具介绍和安装

【学习笔记】Java 一对一培训(第一部分)开发工具介绍和安装 关键词:Java、Spring Boot、Idea、数据库、一对一、培训、教学本文主要内容含开发工具总体介绍、JDK安装、IntelliJ IDEA 安装、MySQL安装、Navicat安装、Redis和RDM安装等计划30分…

Java:升序数组插入一个元素,结果依旧是升序

有一个升序的数组,要求插入一个元素,该数组顺序依然是升序。该数组{10,12,40,70} package input.java; import java.util.Scanner; public class lizi2 {public static void main(String[] args){int temp 0;int arr…

vue项目打包时如何将静态文件打包到一个单独的文件夹

在Vue项目中,你可以使用Webpack的配置来实现将静态文件打包到一个单独的文件夹。下面是一种常见的方法: 在Vue项目的根目录下,创建一个名为static的文件夹(如果还没有)。这个文件夹将用于存放静态文件。在vue.config.j…

代码随想录 -- day53 -- 1143.最长公共子序列 、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同 如果text1[i - 1] 与…

mybatis学习记录(二)-----CRUD--增删改查

目录 使用MyBatis完成CRUDz--增删改查 3.1 insert(Create) 3.2 delete(Delete) 3.3 update(Update) 3.4 select(Retrieve) 查询一条数据 查询多条数据 使用MyBatis完成CRUDz-…

【基础篇】ClickHouse 表引擎详解

文章目录 0. 引言1. 什么是表引擎2. 不同表引擎使用场景1. MergeTree:2. Log:3. Memory:4. Distributed:5. Kafka:6. MaterializedView:7. File和URL: 3. MergeTree 家族3.1. MergeTree:3.2. ReplacingMergeTree:3.3. SummingMergeTree:3.4. AggregatingMergeTree:3.5. Collaps…

全自动orm框架SpringData Jpa 简单使用

目录 介绍 整合springboot 简单使用 基本操作 查询数据 新增 ​编辑 删除 ​编辑 分页查询 自定义方法查询 自定义sql查询 一对一映射 一对多映射 ​编辑 介绍 Spring data JPA是Spring在ORM框架,以及JPA规范的基础上,封装的一套JPA应用框…

C【数组】

1.一维数组 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 int main() { // char arr[] "abcdef";//[a][b][c][d][e][f][\0] // //printf("%c\n", arr[3]);//d // int i 0; // int len strlen(arr); // for(i0; i<len; i) // { // p…

【DBAPI教程】DBAPI如何使用复杂多层嵌套JSON作为请求参数

DBAPI如何使用复杂多层嵌套JSON作为请求参数 DBAPI作为一款后端低代码接口快速开发工具&#xff0c;不仅能实现简单的字段传参给SQL&#xff0c;也可以实现复杂的JSON传参。下面我们就来看一个实际的例子。 背景需求 假设我们现在MySql有一张GDP表&#xff0c;内容如下&…

代码随想录 -- day52 --300.最长递增子序列 、674. 最长连续递增序列 、718. 最长重复子数组

300.最长递增子序列 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 每一个i&#xff0c;对应的dp[i]&#xff08;即最长递增子序列&#xff09;起始大小至少都是1. class Solution { public:int lengt…

Godot使用C#语言编写脚本(使用VSCode作为外部编辑器)

文章目录 Godot部分查看VSCode的所在位置配置外部编辑器 配置VSCode编写脚本中文注释 其他文章字符编码 Godot部分 打开编辑器-编辑器设置&#xff1b; 查看VSCode的所在位置 右键单击你的VScode快捷方式&#xff0c;选择属性。 这里的目标就是你的VSCode所在的位置。 配…

初识Java 9-2 内部类

目录 为什么需要内部类 闭包和回调 内部类和控制框架 继承内部类 内部类的重写&#xff08;并不能&#xff09; 局部内部类 内部类标识符 本笔记参考自&#xff1a; 《On Java 中文版》 为什么需要内部类 在一些情况下&#xff0c;我们无法享受接口带来的便利&#xff0…

差分方程模型:国民总收入(GDP)的乘数-加速数模型

【背景知识-凯恩斯经济增长模型】 凯恩斯(John M.Keynes)建立了著名的国民经济增长模型。令Y表示国民总收入&#xff0c;C表示总消费&#xff0c;E为总支出&#xff0c;I表示投资&#xff0c;G为政府的投入&#xff08;如基建等&#xff09;。那么有 【6.1】 其中&#xff0…

黑马JVM总结(十一)

&#xff08;1&#xff09;垃圾回收概述 前面我们学了堆&#xff0c;里面有一个垃圾回收的机制 &#xff08;2&#xff09;判断垃圾_引用计数 指只要有一个对象被其他变量所引用&#xff0c;我们就让这个对象的计数加1&#xff0c;有个一变量不在引用&#xff0c;让它的计数…