基于OpenCV的图形分析辨认04

目录

一、前言

二、实验目的

三、实验内容

四、实验过程


一、前言

编程语言:Python,编程软件:vscode或pycharm,必备的第三方库:OpenCV,numpy,matplotlib,os等等。

关于OpenCV,numpy,matplotlib,os等第三方库的下载方式如下:

第一步,按住【Windows】和【R】调出运行界面,输入【cmd】,回车打开命令行。

第二步,输入以下安装命令(可以先升级一下pip指令)。

pip升级指令:

python -m pip install --upgrade pip

 opencv库的清华源下载:

pip install opencv-python  -i https://pypi.tuna.tsinghua.edu.cn/simple

numpy库的清华源下载:

 pip install numpy  -i https://pypi.tuna.tsinghua.edu.cn/simple

matplotlib库的清华源下载:

pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

os库的清华源下载:

pip install os  -i https://pypi.tuna.tsinghua.edu.cn/simple 

二、实验目的

1.了解不同图像分割算法;

2.基于函式库,透过调用函式,实现图像分割;

3.基于演算法原理,以函数形式,自行实现图像分割;

三、实验内容

1.任选一张彩色图,透过调用函式(库)完成完成课堂教授内容

(1)Otsu:(1)灰度图分割

(2)Clustering:(1)灰度图分割(2)彩色图像分割

2.任选一张彩色图,透过演算法,自行撰写函式完成完成课堂教授内容

(1)Otsu:(1)灰度图分割

(2)Clustering:(1)灰度图分割(2)彩色图像分割

四、实验过程

(1)基于OpenCV库,使用大津法和kmeans聚类解决问题一,代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as pltdef question1_Otsu():# 读取图像img = cv2.imread(r"D:\Image\img1.jpg")# 转换为灰度图像img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 对图像进行二值化处理(OTSU算法)thresh1, result1 = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 对图像进行反向二值化处理(OTSU算法)thresh2, result2 = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 绘制原始图像、灰度图像、二值化图像、反向二值化图像plt.subplot(2, 2, 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original img'), plt.axis('off')plt.subplot(2, 2, 2), plt.imshow(img_gray, cmap = 'gray'), plt.title('Gray img'), plt.axis('off')plt.subplot(2, 2, 3), plt.imshow(result1, cmap = 'gray'), plt.title('Binary img'), plt.axis('off')plt.subplot(2, 2, 4), plt.imshow(result2, cmap = 'gray'), plt.title('Inverse binary img'), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()def question1_Clustering_gray():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\img1.jpg", 0)# 获取图像的高度和宽度height, width = img.shape[:]# 将图像转换为一维数组data = img.reshape((-1, 1))# 将数据转换为浮点型data = np.float32(data)# 设置聚类停止条件criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.1)# 设置聚类中心的初始化方式flags = cv2.KMEANS_RANDOM_CENTERS# 循环不同的聚类数for k in range(1, 10):if k == 1:# 展示原始图像plt.subplot(3, 3, k), plt.imshow(img, cmap = 'gray'), plt.title('Original img'), plt.axis('off')else:# 执行k-means聚类算法compactness, labels, centers = cv2.kmeans(data, k, None, criteria, 10, flags)# 重构聚类结果图像img_k = labels.reshape((height, width))# 展示聚类结果图像plt.subplot(3, 3, k), plt.imshow(img_k, cmap = 'gray'), plt.title(f'Kmeans img (k={k})'), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()def question1_Clustering_color():# 读取图片img = cv2.imread(r"D:\Image\img1.jpg")# 将图片转换为numpy数组,并进行形状变换,转化成3列data = img.reshape((-1, 3))# 转换为浮点型data = np.float32(data)# 设置聚类停止条件criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.1)# 设置聚类中心的初始化方式flags = cv2.KMEANS_RANDOM_CENTERS# 不同的K值列表K_list = [1, 2, 4, 8, 16, 32]# 遍历不同的K值for k in range(len(K_list)):# 第一个K值特殊处理if k == 0:# 显示原始图片plt.subplot(2, 3, k + 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original img'), plt.axis('off')else:# k-means聚类compactness, labels, centers = cv2.kmeans(data, K_list[k], None, criteria, 10, flags)# 将中心点转换为整型centers = np.uint8(centers)# 根据中心点和标签得到聚类结果res = centers[labels.flatten()]# 重构聚类结果图像img_k = res.reshape((img.shape))# 显示聚类结果图片plt.subplot(2, 3, k + 1), plt.imshow(cv2.cvtColor(img_k, cv2.COLOR_BGR2RGB)), plt.title(f'Kmeans img (k={K_list[k]})'), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()# 执行相应函数
question1_Otsu()
question1_Clustering_gray()
question1_Clustering_color()

代码的运行效果如下:

基于Otsu的灰度图分割:

基于kmeans的灰度图分割:

基于kmeans的彩色图分割:

(2)不使用OpenCV库,根据otsu和kmeans的原理,编写代码文件,命名为【Methods】,具体代码如下:

import numpy as npdef Otsu(img):# 复制图像数据data = img.copy()# 将数据转换为float32类型data = np.float32(data)# 获取图像的高度和宽度height, width = img.shape[:]# 初始化阈值和最大类间方差threshold_t = 0otsu_max = 0# 遍历255以内的每个灰度值for t in range(256):# 选取像素值小于等于阈值的像素点n0 = data[np.where(data <= t)]# 选取像素值大于阈值的像素点n1 = data[np.where(data > t)]# 计算像素点权重weight0 = len(n0) / (height * width)weight1 = len(n1) / (height * width)# 计算均值u0 = np.mean(n0) if len(n0) > 0 else 0.u1 = np.mean(n1) if len(n1) > 0 else 0.# 计算类间方差otsu = weight0 * weight1 * (u0 - u1) ** 2# 更新最大类间方差和阈值if otsu > otsu_max:otsu_max = otsuthreshold_t = tprint('类间方差最大阈值:', threshold_t)# 将像素值小于等于阈值的像素点设为0data[data <= threshold_t] = 0# 将像素值大于阈值的像素点设为255data[data > threshold_t] = 255# 将数据转换为uint8类型img_result = np.uint8(data)return img_resultdef Kmeans(img, k, iter):# 判断图像是否为灰度图像if len(img.shape) == 2:# 获取图像高度和宽度height, width = img.shape[:]# 将图片转换为numpy数组,并进行形状变换,转化成1列data = img.reshape((-1, 1))else:# 获取图像高度和宽度height, width = img.shape[:2]# 将图片转换为numpy数组,并进行形状变换,转化成3列data = img.reshape((-1, 3))# 将数据转换为浮点型data = np.float32(data)# 创建一个与数据长度相等的全零数组labels = np.zeros((height * width))# 随机选择k个点作为初始簇心cluster_centers_random = np.random.choice(height * width, k, replace = False)cluster_centers = data[cluster_centers_random, :]# 初始化距离数组distance = [ [] for i in range(k)]# 迭代k次for i in range(iter):print("第%d次迭代开始"% (i + 1))# 计算每个数据点到簇心的距离for j in range(k):distance[j] = np.sqrt(np.sum(np.square(data - cluster_centers[j]), axis = 1))# 根据距离最小的簇心标记每个数据点的类别labels = np.argmin(np.array(distance), axis = 0)# 更新簇心为每个簇内数据点的均值for j in range(k):cluster_centers[j] = np.mean(data[labels == j], axis = 0)# 判断图像是否为灰度图像if len(img.shape) == 2:# 重构聚类结果图像img_result = labels.reshape((height, width))else:# 将簇心转换为整型centers = np.uint8(cluster_centers)# 根据簇心和标签得到聚类结果res = centers[labels.flatten()]# 重构聚类结果图像img_result = res.reshape((img.shape))print("K-means聚类完成\n")return img_result

通过调用上述代码,解决问题二,问题二的解决代码如下:

import cv2
import matplotlib.pyplot as plt
from Methods import *def question2_Otsu():# 读取图像img = cv2.imread(r"D:\Image\img1.jpg")# 将彩色图像转为灰度图像img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用Otsu算法进行图像二值化img_otsu = Otsu(img_gray)# 复制img_otsu图像,进行反二值化img_otsu_inv = img_otsu.copy()# 反二值化img_otsu_inv = 255 - img_otsu# 绘制原始图像、灰度图像、二值化图像、反向二值化图像plt.subplot(2, 2, 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original img'), plt.axis('off')plt.subplot(2, 2, 2), plt.imshow(img_gray, cmap = 'gray'), plt.title('Gray img'), plt.axis('off')plt.subplot(2, 2, 3), plt.imshow(img_otsu, cmap = 'gray'), plt.title('Binary img'), plt.axis('off')plt.subplot(2, 2, 4), plt.imshow(img_otsu_inv, cmap = 'gray'), plt.title('Inverse binary img'), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()def question2_Clustering_Gray():# 读取图片img = cv2.imread(r"D:\Image\img1.jpg", 0)# 循环遍历k值for k in range(1, 10):# 显示原始图像if k == 1:plt.subplot(3, 3, k), plt.imshow(img, cmap = 'gray'), plt.title("Original img"), plt.axis('off')else:# 对图像进行kmeans聚类img_kmeans_gray = Kmeans(img, k, 50)# 显示聚类后的图像plt.subplot(3, 3, k), plt.imshow(img_kmeans_gray, cmap = 'gray'), plt.title(f'Kmeans img (k={k})'), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()def question2_Clustering_color():# 读取图像img = cv2.imread(r"D:\Image\img1.jpg")# 不同的K值列表K_list = [1, 2, 4, 8, 16, 32]# 遍历不同的K值for i in range(len(K_list)):# 第一个K值特殊处理if i == 0:# 显示原始图片plt.subplot(2, 3, i + 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title("Original img"), plt.axis('off')else:# 执行Kmeans聚类,并显示聚类后的图像img_kmeans = Kmeans(img, K_list[i], 50)plt.subplot(2, 3, i + 1), plt.imshow(cv2.cvtColor(img_kmeans, cv2.COLOR_BGR2RGB)), plt.title(f"Kmeans img (k={K_list[i]})"), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()# 执行相应函数
question2_Otsu()
question2_Clustering_Gray()
question2_Clustering_color()

代码的运行效果如下: 

 基于Otsu原理的灰度图分割:

基于kmeans原理的灰度图和彩色图分割:

上述就是使用OpenCV库解决问题一,根据算法原理编写代码文件解决问题二。

都看到最后了,不点个赞吗?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SqlServer中连续号及断号查询—附源码

效果如下图所示&#xff1a; SqlServer中连续号及断号查询SQL如下&#xff1a; --1.定义临时表 DECLARE TestTemp TABLE(TestCode NVARCHAR(50),TestNum INT )DECLARE DataTemp TABLE(TestCode NVARCHAR(50),TestNumStr NVARCHAR(100) )--2.插入测试数据 INSERT INTO TestT…

C及C++每日练习(1)

一.选择&#xff1a; 1.以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A.是无限循环 B.循环次数不定 C.4次 D.3次 对于循环&#xff0c;其组成部分可以四个部分&#xff1a; for(初始化;循环进行条件;调整) …

基于Java的校园失物招领管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 招领管理模块2.2 寻物管理模块2.3 系统公告模块2.4 感谢留言模块 三、界面展示3.1 登录注册3.2 招领模块3.3 寻物模块3.4 公告模块3.5 感谢留言模块3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 校园失物招领…

Cyber RT 开发工具

在Cyber RT中还提供了一些工具&#xff0c;这些工具可以拓展Cyber RT功能、提高开发调试效率&#xff0c;本章主要介绍这些工具的使用。 本章内容: 1.cyber record工具的应用&#xff1b; 2.常用命令工具的使用&#xff1b; 学习收获: 1.可以通过cyber record将发布的话题消息…

因果学习篇(2)-Causal Attention for Vision-Language Tasks(文献阅读)

Causal Attention for Vision-Language Tasks 引言 这篇论文是南洋理工大学和澳大利亚莫纳什大学联合发表自2021年的CVPR顶会上的一篇文献&#xff0c;在当前流行的注意力机制中增加了因果推理算法&#xff0c;提出了一种新的注意力机制&#xff1a;因果注意力(CATT)&#xff…

AI智商排名:Claude-3首次突破100

用挪威门萨&#xff08;智商测试题&#xff09;中 35 个问题对chatGPT等人工智能进行了测试&#xff1a; ChatGPT 对ChatGPT进行了两次挪威门萨测试&#xff0c;在 35 个问题中&#xff0c;它平均答对了 13 个&#xff0c;智商估计为 85。 测试方法 每个人工智能都接受了两次…

2023第十届GIAC全球互联网架构大会:洞察未来互联网架构的革新与突破(附大会核心PPT下载)

随着互联网的迅猛发展&#xff0c;其底层架构的演进与革新成为了推动全球数字化进程的关键力量。2023年第十届GIAC全球互联网架构大会如期而至&#xff0c;汇聚了全球互联网架构领域的顶尖专家、学者、企业领袖和创新者&#xff0c;共同探讨和展望互联网架构的未来发展趋势。本…

RabbitMQ 基本介绍

RabbitMQ 基本介绍 消息模型 所有 MQ 产品从模型抽象上来说都是一样的过程&#xff1a; 消费者&#xff08;consumer&#xff09;订阅某个队列。生产者&#xff08;producer&#xff09;创建消息&#xff0c;然后发布到队列&#xff08;queue&#xff09;中&#xff0c;最后…

centos7安装maven离线安装

1、从官方网站下载maven文件包 官方下载网站&#xff1a;https://maven.apache.org/download.cgi 2、创建文件夹解压文件 将下载好的安装包&#xff0c;放到创建的目录下&#xff0c;并解压 a、创建/app/maven文件 mkdir /app/mavenb、解压文件 tar -zxvf apache-maven-…

C#使用whisper.net实现语音识别(语音转文本)

目录 介绍 效果 输出信息 项目 代码 下载 介绍 github地址&#xff1a;https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下载地址&#xff1a;https://huggingface.co/sandrohanea/whisper.net/tree…

32、Redis 7系列:Spring Boot集成Redis

32、Redis 7系列&#xff1a;Spring Boot集成Redis 一、前言二、集成 RedisTemplate1、单机&#xff08;1&#xff09;新建项目&#xff08;2&#xff09;修改pom文件&#xff08;3&#xff09;修改yml文件&#xff08;4&#xff09;启动类&#xff08;5&#xff09;配置类&…

1.初识python

1.初识python 编程语言是用来定义计算机程序的语言&#xff0c;用来向计算机发出指令。 1.python语言是一种面向对象的解释型高级编程语言。 解释型语言&#xff1a;使用专门的解释器对源码程序逐行解释成特定平台的机器并立即执行&#xff0c;是代码在执行时才被解释器一行行…

centos7 部署kibana

先决条件参考 虚拟机部署elasticsearch集群-CSDN博客 这里使用elk101服务器安装kibana 下载rpm包(这里添加了-c参数用到wget的断点续传功能) #下载kibana-rpm包以及校验文件 wget -c https://artifacts.elastic.co/downloads/kibana/kibana-7.17.18-x86_64.rpm wget -c htt…

尤雨溪:Vue 未来展望新的一轮

十年&#xff0c;一个既漫长又短暂的时光跨度&#xff0c;对于技术世界来说&#xff0c;更是沧海桑田的瞬间。在这十年里&#xff0c;Vue.js 从无到有&#xff0c;从默默无闻到蜚声全球&#xff0c;不仅改变了前端开发的面貌&#xff0c;更成为了无数开发者手中的得力工具。 在…

设计模式之策略模式实践

设计模式之策略模式实践 先了解一下策略模式的定义是什么&#xff1f;解决什么问题 策略模式是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装成一个类&#xff0c;并使它们可以互相替换。策略模式允许客户端在运行时从可互换的算法中选择一个&a…

【论文精读】TextDiffuser-2:释放语言模型用于文本渲染的力量

文章目录 一、前言二、摘要三、方法&#xff08;一&#xff09;TextDiffuser-2模型的整体架构&#xff08;二&#xff09;语言模型M1将用户提示转换为语言格式的布局&#xff08;三&#xff09;将提示和布局结合到扩散模型内的可训练语言模型M2中进行编码以生成图像 四、实验&a…

基于单片机的数字温度计设计

目 录 摘 要 I Abstract II 引 言 1 1 整体方案设计 3 1.1 主控芯片类型选择 3 1.2 测温电路选择 3 1.3 系统总体方案 4 2 系统的硬件电路设计 5 2.1 单片机系统设计 5 2.2 显示模块设计 8 2.3 温度读取电路的设计 10 3 系统软件设计 13 3.1 软件开发环境的介绍 13 3.2 系统重…

ubuntu_定制文件系统[2]-清理日志log

1.问题现象 系统长时间运行, 产生大量的系统日志 ubuntu/debian 系统日志如下 /var/log$ du -sh * 31M syslog # syslog日志 61M syslog.1 2.5G journal/ # systemd service日志 当日志文件过大, 硬盘空间占用100%时, 导致各种异常 命令按tab补全无响应服务/进程启动异常服务…

Docker之若依项目部署

目录 一、搭建项目的局域网 1.1搭建局域网 1.2查看局域网 1.3注意&#xff1a;要关闭防火墙&#xff0c;关闭后要重启docker 二、redis安装 2.1创建目录 2.2修改redis.conf文件 三、MySQL安装 3.1安装 3.2设置远程连接 3.3创建数据库 四、若依后端项目搭建 4.1创建…

挑战杯 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的植物识别算法 ** …