基于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.mzph.cn/news/725779.shtml

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

相关文章

LeetCode.2917. 找出数组中的 K-or 值

题目 2917. 找出数组中的 K-or 值 分析 这道题其实是要我们求第i位二进制为1的元素个数至少为k&#xff0c;把符合条件的2^i全部加到一起。 因此&#xff0c;我们的思路就是枚举数组的每一位&#xff0c;并且进行以下两个步骤&#xff1a; 统计所有元素第i位1的个数cnt。…

【论文阅读】DeepLab:语义图像分割与深度卷积网络,自然卷积,和完全连接的crf

【论文阅读】DeepLab:语义图像分割与深度卷积网络&#xff0c;自然卷积&#xff0c;和完全连接的crf 文章目录 【论文阅读】DeepLab:语义图像分割与深度卷积网络&#xff0c;自然卷积&#xff0c;和完全连接的crf一、介绍二、联系工作三、方法3.1 整体结构3.2 使用空间金字塔池…

弹性地基梁matlab有限元编程 | 双排桩支护结构 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

mysql bug( InnoDB: Error number 22),表突然不能读取

mysql bug&#xff08; InnoDB: Error number 22&#xff09;&#xff0c;表突然不能读取 bug最开始的bug&#xff1a;表突然不能读取关闭mysql容器&#xff0c;再次重启失败 解决方案不重建容器的几种可能措施重建容器重建如果懒得打命令或者忘记命令可能的run bug&#xff1a…

打破界限,释放创新:一键将HTML转化为PDF

在互联网时代&#xff0c;HTML作为网页的标准语言&#xff0c;承载着无数的信息与创意。然而&#xff0c;有时我们需要将这些在线内容转化为可打印、可分享的PDF格式。这时&#xff0c;一款高效、便捷的转换工具就显得尤为重要。 首先&#xff0c;我们要进入首助编辑高手主页面…

react高阶组件:如何同时兼容class类组件和函数式组件。

场景&#xff1a; 每个页面都要实现分享功能&#xff0c;但是页面有些是用class类&#xff0c;有些又直接是函数式。 方案1&#xff1a; 写2套方法。各自引用。&#xff08;维护不太好&#xff0c;改要改2遍&#xff09; 方案2&#xff1a; 可以封一个 jsx的组件&#xff0c…

中国制造走向世界wordpress外贸建站模板主题

水泵阀门wordpress外贸网站模板 水泵、阀门、管材、管件wordpress外贸网站模板&#xff0c;适合外贸独立站的网站模板。 https://www.jianzhanpress.com/?p3748 保健器械wordpress外贸网站主题 保健、健身器械wordpress外贸网站主题&#xff0c;适合做外贸网站的wordpress模…

【QT C++实践】Qt 项目中一个界面动态处理多张数据库中的表|附源码

一、前言 在之前那篇讲如何使用QT连接数据库时&#xff08;QT C实践|超详细数据库的连接和增删改查操作|附源码)&#xff0c;做了一个简单的对数据库进行增删改查的界面(如下&#xff09;。 但是存在一个问题就是&#xff1a;这个界面只是对一张表进行操作&#xff0c;但是我…

2023年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-选择题解析

2023年 中小学信息学奥赛CSP-J真题解析 1、在C中&#xff0c;下面哪个关键字用于声明一个变量&#xff0c;其值不能被修改 A、unsigned B、const C、static D、mutable 答案&#xff1a;B 考点分析&#xff1a;主要考查变量声明相关知识&#xff0c;const是声明常量&…

0基础跨考408|一战上岸复盘及经验分享

基础阶段‼️ 王道的四本书的选择题部分要都做完、订正完。 王道的四门视频课要一轮刷完&#xff08;或者题主在B站看了其他的老师&#xff0c;这其实也是算一轮的&#xff0c;只要题主是认真学习了的&#xff0c;题主说自己不知道看什么课&#xff0c;王道就好了&#xff09;…

Go程序是如何编译并运行起来的(图文详解)

Go程序是如何编译的 从hello RdrB1te开始 package main import "fmt" func main() { fmt.Println("hello RdrB1te") }不实际编译它&#xff0c;只输出它的编译过程&#xff1a; go build -n简单的编译过程分析&#xff1a; 上面的过程确认了两个…

Cookie和Session(会话技术)

文章目录 Cookie和Session&#xff08;会话技术&#xff09;一、Cookie1、Cookie概述1.1、Cookie简介1.2、Cookie的使用场景1.3、Cookie底层原理 2、Cookie的基本使用3、Cookie实现显示用户上次访问时间4、Cookie编码与解码5、Cookie总结 二、Session1、Session概述1.1、Sessio…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+OSD动态字符叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS多路视频融合叠加应用…

基于Matlab实现免疫荧光图像中的区域定位算法

基于Matlab实现免疫荧光图像中的区域定位算法 免疫荧光法。以荧光染料为标记物,试纸条为载体,发生抗原抗体特异性反应,根据免疫复合物被激发的荧光强度对待测物进行定量分析[。该方法具有环境要求不高、操作简单快速、无污染且荧光染料丰富等优点。 常用于食品安全检测过程中…

vue3+element plus 实现百度地图显示路径

添加依赖 <!-- index.html --><script type"text/javascript" src"//api.map.baidu.com/getscript?v3.0&akyI6kBeC9G4LntEWXklE2iNHwRUrmFEQc"></script><script type"text/javascript" src"//api.map.baidu.co…

【golang】26、retry-go 使用示例和源码解析

文章目录 一、使用方法1.1 http 示例1.1.1 retry.Do1.1.2 retry.DoWithData1.1.3 OnRetry1.1.4 根据 error 的类型&#xff0c;决定 delay 的时长1.1.5 自定义 retry function 二、API2.1 Do 执行2.1.1 Do2.1.2 DoWithData 2.2 Delay 策略2.3 错误处理2.3.1 Unwrap2.3.2 Unwrap…

idea手动导入插件

idea有时候连接不上 我们去手动下载压缩包 插件网址 选择下载的压缩包导入 导入成功

算力调度和云计算有何区别

Canalys发布的研究报告显示&#xff0c;2023年第二季度&#xff0c;全球云基础设施服务支出增长16%&#xff0c;达到724亿美元。 此前云厂商们的高速增长&#xff0c;主要归功于大规模的企业数字化转型和上云。当前市场的增速放缓&#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…

continue、break 和 return 的区别是什么?

continue、break和return同样是用于控制程序流程的关键字&#xff0c;它们有不同的作用和用法。 continue: 在Java中&#xff0c;continue语句同样通常用于循环结构&#xff08;如for循环、while循环&#xff09;。当程序执行到continue时&#xff0c;会立刻跳过当前循环中剩…