基于OpenCV的图形分析辨认03

目录

一、前言

二、实验目的

三、实验内容

四、实验过程


一、前言

编程语言: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.根据实验内容2-4要求,调试出所提供图片对应的参数;

三、实验内容

1.任选一张彩色图完成课堂教授内容,并以函数形式封装功能,包含:

  1. Image Negatives
  2. Log Transformations
  3. Power-Law Transformations
  4. Piecewise-Linear Transformations
  5. Contrast Stretching
  6. Gray-Level Slicing
  7. Bit-Plane Slicing

2.透过gramma correction,尝试不同参数,将下图還原成原亮度。

3.透过gramma correction,尝试不同参数,将下图還原成原亮度。

4.透过Bit-Plane Slicing,尝试获得下图结果。

Hint:考虑移除细节部分

四、实验过程

根据原理写成一个代码文件,命名为【Methods】,具体代码如下:

import cv2
import numpy as npdef Image_Negatives(img):# 将输入图像转换为灰度图像和反转图像的函数gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)dst = 255 - grayreturn dstdef Log(img, c):# 对输入图像进行对数运算并缩放output = c * np.log(1.0 + img)output = np.uint8(output + 0.5)return outputdef Gamma(img, k):# 对图像进行伽马校正img_gamma = np.power(img, k)  # 将图像的每个像素值的幂次方为knormImg = 255. * (img_gamma - img_gamma.min()) / (img_gamma.max() - img_gamma.min() + 1e-6)  # 对归一化后的图像进行重新线性化img_Gamma = np.uint8(normImg)  # 将归一化后的图像转换为0到255之间的无符号整型return img_Gamma  # 返回伽马校正后的图像def Contrast_Stretching(img, height, width):rMin = img.min()  # 查找图像最低像素值rMax = img.max()  # 查找图像最高像素值r1, s1 = rMin, 0  # 初始化r1和s1为最低像素值和0r2, s2 = rMax, 255  # 初始化r2和s2为最高像素值和255img_Stretch = np.empty((width, height), np.uint8)  # 创建一个与输入图像相同大小的空矩阵,用于存储扩展对比度后的图像k1 = s1 / r1  # 计算k1,用于将低于最低像素值的像素值映射到0k2 = (s2 - s1) / (r2 - r1)  # 计算k2,用于将介于最低像素值和最高像素值之间的像素值映射到0到255的范围k3 = (255 - s2) / (255 - r2)  # 计算k3,用于将高于最高像素值的像素值映射到0到255的范围for h in range(height):  # 遍历图像的每一行for w in range(width):  # 遍历图像的每一列if img[h, w] < r1:  # 如果像素值低于最低像素值img_Stretch[h, w] = k1 * img[h, w]  # 将像素值映射到0elif r1 <= img[h, w] <= r2:  # 如果像素值介于最低像素值和最高像素值之间img_Stretch[h, w] = k2 * (img[h, w] - r1) + s1  # 将像素值映射到0到255的范围elif img[h, w] > r2:  # 如果像素值高于最高像素值img_Stretch[h, w] = k3 * (img[h, w] - r2) + s2  # 将像素值映射到0到255的范围return img_Stretch  # 返回扩展对比度后的图像def Gray_Level_Slicing(img, a, b, form):img1 = img.copy()  # 复制图像矩阵if form == "binary":  # 如果形式为二值化img1[(img1[:, :] < a) | (img1[:, :] > b)] = 0  # 将灰度值小于a或大于b的像素点设置为0img1[(img1[:, :] >= a) & (img1[:, :] <= b)] = 255  # 将灰度值大于等于a且小于等于b的像素点设置为255elif form == "grayscale":  # 如果形式为灰度化img1[(img1[:, :] >= a) & (img1[:, :] <= b)] = 255  # 将灰度值大于等于a且小于等于b的像素点设置为255return img1  # 返回处理后的图像矩阵def Bit_Plane_Slicing(img, height, width, i):# 将图像的每个像素点转换为8位二进制表示,然后提取第i个比特位,生成一个新的图像。imgBit = np.empty((height, width), dtype = np.uint8)for h in range(height):for w in range(width):x = np.binary_repr(img[h, w], width = 8)x = x[::-1]a = x[i - 1]imgBit[h, w] = int(a)return imgBit

利用上述原理代码实现各种图片变化,执行代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
from Methods import *def image_negatives():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\img1.jpg")img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 调用Image_Negatives函数对图像进行反转处理img_negative = Image_Negatives(img)# 绘制原始图像、灰度图像、反转图像plt.subplot(1, 3, 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original img'), plt.axis('off')plt.subplot(1, 3, 2), plt.imshow(img_gray, cmap = 'gray'), plt.title('gray img'), plt.axis('off')plt.subplot(1, 3, 3), plt.imshow(img_negative, cmap = 'gray'), plt.title('dst img'), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()def log():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\img1.jpg", 0)# 调用Log函数对图像进行对数变换output = Log(img, 40)# 绘制原始图像、对数变换图像plt.subplot(1, 2, 1), plt.imshow(img, cmap = 'gray', vmin = 0, vmax = 225), plt.title('Original img'), plt.axis('off')plt.subplot(1, 2, 2), plt.imshow(output,cmap = 'gray', vmin = 0, vmax = 225), plt.title('output img'), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()def gamma():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\img1.jpg", 0)# 定义Gamma值列表gammaList = [0.125, 0.25, 0.5, 1.0, 2.0, 4.0]for k in range(len(gammaList)):# 调用Gamma函数对图像进行Gamma校正imgGamma = Gamma(img, gammaList[k])# 设置子图参数,关闭坐标轴plt.subplot(2, 3, k + 1), plt.axis('off')# 显示图像,设置灰度映射范围plt.imshow(imgGamma, cmap = 'gray', vmin = 0, vmax = 255)# 设置子图标题,插入Gamma值plt.title(f"$\gamma = {gammaList[k]}$")# 调整图像布局并显示图像plt.tight_layout()plt.show()def contrast_stretching():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\img1.jpg", 0)# 获取图像的高度和宽度height, width = img.shape[:2]# 进行对比度拉伸img_stretch = Contrast_Stretching(img, height, width)# 显示原始图像、拉伸图像plt.subplot(1, 2, 1), plt.imshow(img, cmap = 'gray', vmin = 0, vmax = 255), plt.title('Original img'), plt.axis("off")plt.subplot(1, 2, 2), plt.imshow(img_stretch, cmap = 'gray', vmin = 0, vmax = 255), plt.title('Stretch img'), plt.axis("off")# 调整图像布局并显示图像plt.tight_layout()plt.show()def gray_level():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\img1.jpg", 0)# 设置阈值范围a, b = 155, 245# 生成二值图像form = "binary"# 使用灰度切割法生成二值图像img_binary = Gray_Level_Slicing(img, a, b, form)# 生成灰度图像form = "grayscale"# 使用灰度切割法生成灰度图像img_grayscale = Gray_Level_Slicing(img, a, b, form)# 显示原始图像、二值图像和灰度图像plt.subplot(1, 3, 1), plt.imshow(img, cmap = 'gray'), plt.title('Original img'), plt.axis('off')plt.subplot(1, 3, 2), plt.imshow(img_binary, cmap = 'gray'), plt.title('Binary img'), plt.axis('off')plt.subplot(1, 3, 3), plt.imshow(img_grayscale, cmap = 'gray'), plt.title('Grayscale img'), plt.axis('off')# 调整图像布局并显示图像plt.tight_layout()plt.show()def bit_plane():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\img1.jpg", 0)height, width = img.shape[:2]for i in range(9, 0, -1):# 创建子图并设置子图位置和刻度plt.subplot(3, 3, (9 - i) + 1, xticks = [], yticks = [])if i == 9:# 显示原始图像并添加标题plt.imshow(img, cmap = 'gray'), plt.title('Original img')else:# 进行位平面切割并显示切割后的图像,添加标题img_bit = Bit_Plane_Slicing(img, height, width, i)plt.imshow(img_bit, cmap = 'gray'), plt.title(f"{bin((i - 1))}")# 调整图像布局并显示图像plt.tight_layout()plt.show()# 执行相应函数
image_negatives()
log()
gamma()
contrast_stretching()
gray_level()
bit_plane()

接下来是每种方法对图像的变化情况,具体演示如下:

1.(1)图像反转:

(2)对数变换:

 

(3)伽马变换:

(4)对比度拉伸:

(5)灰度级分层:

(6)比特平面分层:

2.问题二到四的还原亮度代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
from Methods import *def question1():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\HW3-2.jpg", 0)# 定义Gamma值列表gammaList = [0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.325, 0.35, 0.375, 0.4]for k in range(len(gammaList)):# 调用Gamma函数对图像进行Gamma校正imgGamma = Gamma(img, gammaList[k])# 设置子图参数,关闭坐标轴plt.subplot(4, 4, k + 1), plt.axis('off')# 显示图像,设置灰度映射范围plt.imshow(imgGamma, cmap = 'gray', vmin = 0, vmax = 255)# 设置子图标题,插入Gamma值plt.title(f"$\gamma = {gammaList[k]}$")# 调整图像布局并显示图像plt.tight_layout()plt.show()def question2():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\HW3-3.jpg", 0)# 定义Gamma值列表gammaList = [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5]for k in range(len(gammaList)):# 调用Gamma函数对图像进行Gamma校正imgGamma = Gamma(img, gammaList[k])# 设置子图参数,关闭坐标轴plt.subplot(4, 4, k + 1), plt.axis('off')# 显示图像,设置灰度映射范围plt.imshow(imgGamma, cmap = 'gray', vmin = 0, vmax = 255)# 设置子图标题,插入Gamma值plt.title(f"$\gamma = {gammaList[k]}$")# 调整图像布局并显示图像plt.tight_layout()plt.show()def question3():# 读取图像并转换为灰度图像img = cv2.imread(r"D:\Image\HW3-4.jpg", 0)height, width = img.shape[:2]for i in range(9, 0, -1):# 创建子图并设置子图位置和刻度plt.subplot(3, 3, (9 - i) + 1, xticks = [], yticks = [])if i == 9:# 显示原始图像并添加标题plt.imshow(img, cmap = 'gray'), plt.title('Original img')else:# 进行位平面切割并显示切割后的图像,添加标题img_bit = Bit_Plane_Slicing(img, height, width, i)plt.imshow(img_bit, cmap = 'gray'), plt.title(f"{bin((i - 1))}")# 调整图像布局并显示图像plt.tight_layout()plt.show()# 执行相应函数解决相应问题
question1()
question2()
question3()

对于问题二,代码运行效果如下:

伽马变换的伽马值为0.1到0.3之间较为合适,与题目要求图像最为接近。

3.问题三的代码运行效果如下:

伽马变换的伽马值为1.0到2.0之间较为合适,与题目要求图像最为接近。

4.问题四的代码运行效果如下:

从实验结果来看,比特平面分层中的第八层和第七层较为符合题目图像。

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

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

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

相关文章

微信小程序云开发教程——墨刀原型工具入门(编辑页面)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

Hello C++ (c++是什么/c++怎么学/c++推荐书籍)

引言 其实C基础语法基本上已经学完&#xff0c;早就想开始写C的博客了&#xff0c;却因为其他各种事情一直没开始。原计划是想讲Linux系统虚拟机安装的&#xff0c;后来考虑了一下还是算了&#xff0c;等Linux学到一定程度再开始相关博客的写作和发表吧。今天写博客想给C开个头…

excel 动态列导出

excel动态列&#xff0c;只好用poi来写了&#xff0c;也并不复杂&#xff0c;一样就这个件事情抽像为几步&#xff0c;就是套路了&#xff0c;开发效率就上去了。 1 准备空模板 导出操作与excel模板的导出一样&#xff0c;可以参考excel导出标准化 2 自定义SheetWriteHandler …

Python 一步一步教你用pyglet制作汉诺塔游戏

目录 汉诺塔游戏 1. 抓取颜色 2. 绘制圆盘 3. 九层汉塔 4. 绘制塔架 5. 叠加圆盘 6. 游戏框架 汉诺塔游戏 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候&#xff0c;他做了三根金刚…

Python错题集-8:AttributeError(找不到对应的对象的属性)

1问题描述 AttributeError: AxesSubplot object has no attribute arc 2代码详情 import matplotlib.pyplot as plt# 创建一个新的图形和坐标轴 fig, ax plt.subplots()# 定义弧线的参数 center (0.5, 0.5) # 圆心坐标 (x, y) width 1.0 # 半径 height 0.5 # 半径 ang…

使用阿里云服务器搭建网站简单吗?超简单教程

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网aliyunfuwuqi.com以搭建WordPress网站博客为例&#xff0c;来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流…

AI领域再出“王炸“----Claude3是否会成为下一个“神“

目录 一.Claude3最新发布 二.Claude3支持20万token 三.Claude3在未公开算法上取得重大突破 1.Claude 3读懂博士论文 2.量子跃迁集成&#xff1a; Claude 3智商&#xff1a;101 测试方法 测试细节 通过Karpathy挑战 Claude 3自画像&#xff0c;突破本我 从洛杉矶排到…

MySQl基础入门⑦

上一章知识内容 分析数据且区分数据类型 看下表分析数据的特征&#xff0c;根据其特征确定相应的数据类型。 分析以上表格特征&#xff0c;确定数据类型&#xff0c;并对数据进行分类。分析数据后按固定长度字符串、可变长度字符串、整数、固定精度小数和日期时间数据类型对数…

VS Code引入ECharts

Charts是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;提供了丰富的图表类型和交互能力。&#xff08;摘自菜鸟教程&#xff09; 下面我们来介绍一下VS Code引入ECharts的相关操作 检查电脑是否已经安装了Java语言的软件开发工具包 ECharts…

WebMagic框架

1.webmagic框架 webmagic框架是一个Java实现的爬虫框架&#xff0c;底层依然是HttpClient和jsoup 组件&#xff1a; downloader&#xff1a;下载器组件PageProcessor&#xff1a;页面解析组件&#xff08;必须自定义&#xff09;scheculer&#xff1a;访问队列组件pipeline&am…

kafka查看消息两种方式(命令行和软件)+另附发送消息方式

1、命令行方式 ①找到kafka安装文件夹 ②执行命令 #指定offset为指定时间作为消息起始位置 kafka-consumer-groups.sh \ --bootstrap-server 20.2.246.116:9092 \ --group group_1 \ --topic lanxin_qiao \ --reset-offsets \ --to-datetime 2023-07-19T01:00:00.000 \ -exe…

Linux--基础命令

一.pwd&#xff08;Print Working Directory&#xff09; (1)pwd:显示当前位置的绝对路径; 二.cd (Change Directory) (2)cd:切换目录,cd的参数表示要切换的位置,可以使用绝对路径或者相对路径; 三.ls (3)ls:显示目录中的文件 (l a i) ls补充: 理解使用: -A 显现除 “.”和“…

20-Java备忘录模式 ( Memento Pattern )

Java备忘录模式 摘要实现范例 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象 备忘录模式属于行为型模式 摘要 1. 意图 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对…

mockjs学习

1.前言 最近面试发现之前团队协同合作的项目没有mock数据难以向面试官直接展示&#xff0c;所以迟到得来速学一下mockjs。 参考视频&#xff1a;mockJs 妈妈再也不用担心我没有后端接口啦_哔哩哔哩_bilibili 一开始查阅了一些资料&#xff0c;先是看了下EasyMock&#xff0c…

利用websocket +定时器简易的实现一个网络聊天室

其实原理非常简单,就是客户端用户通过websoket来连接websocket服务端。然后服务端,收集每个用户发出的消息, 进而将每条用户的消息通过广播的形式推送到每个连接到服务端的客户端。从而实现用户的实时聊天。 // TODO : 我主要是讲一下实现思路。并未完善其功能。 1.后端 依赖 …

Spring MVC 全局异常处理器

如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 1.异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由异常处理器进行异…

Tensorflow2.0+部署(tensorflow/serving)过程备忘记录Windows+Linux

Tensorflow2.0部署&#xff08;tensorflow/serving&#xff09;过程备忘记录 部署思路&#xff1a;采用Tensorflow自带的serving进模型部署&#xff0c;采用容器docker 1.首先安装docker 下载地址&#xff08;下载windows版本&#xff09;&#xff1a;https://desktop.docke…

Jmeter之Ramp-up Period(in seconds)

1、Ramp-up Period概念 &#xff08;in seconds&#xff09;–并发用户启动周期&#xff0c;告知JMeter 要在多长时间内启动全部Vuser用户。 2、为什么需要有“ramp-up period”&#xff0c;立即启动所有的并发用户数不是更好&#xff1f; 对于绝大多数的网址或应用&#xf…

【Prometheus】DataModel

数据模型 DataModel 指标 Metric metric 包含 metric name 和 metric label 格式&#xff1a; <metric name>{<label name><label value>, ...}例如&#xff1a;服务器 HTTP 接口 /messages 的总请求数 api_http_requests_total{method"POST",…

Jmeter(三) - 从入门到精通 - 测试计划(Test Plan)的元件(详解教程)

1.简介 上一篇中已经教你如何通过JMeter来创建一个测试计划&#xff08;Test Plan&#xff09;&#xff0c;那么这一篇我们就将JMeter启动起来&#xff0c;创建一个测试计划&#xff08;Test plan&#xff09;&#xff0c;然后给大家介绍一下测试计划&#xff08;Test Plan&am…