基于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 np

def Image_Negatives(img):
    # 将输入图像转换为灰度图像和反转图像的函数
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    dst = 255 - gray
    return dst

def Log(img, c):
    # 对输入图像进行对数运算并缩放
    output = c * np.log(1.0 + img)
    output = np.uint8(output + 0.5)
    return output

def Gamma(img, k):
    # 对图像进行伽马校正
    img_gamma = np.power(img, k)  # 将图像的每个像素值的幂次方为k
    normImg = 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为最低像素值和0
    r2, s2 = rMax, 255  # 初始化r2和s2为最高像素值和255
    img_Stretch = np.empty((width, height), np.uint8)  # 创建一个与输入图像相同大小的空矩阵,用于存储扩展对比度后的图像
    k1 = s1 / r1  # 计算k1,用于将低于最低像素值的像素值映射到0
    k2 = (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]  # 将像素值映射到0
            elif 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的像素点设置为0
        img1[(img1[:, :] >= a) & (img1[:, :] <= b)] = 255  # 将灰度值大于等于a且小于等于b的像素点设置为255
    elif form == "grayscale":  # 如果形式为灰度化
        img1[(img1[:, :] >= a) & (img1[:, :] <= b)] = 255  # 将灰度值大于等于a且小于等于b的像素点设置为255
    return 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.mfbz.cn/a/435661.html

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

相关文章

spring 注解缓存查询方法使用

spring-boot项目启动类上加注解: EnableCaching 查询方法注解: Cacheable

Sodinokibi勒索病毒最新变种,勒索巨额赎金

前言 Sodinokibi勒索病毒在国内首次被发现于2019年4月份&#xff0c;2019年5月24日首次在意大利被发现&#xff0c;在意大利被发现使用RDP攻击的方式进行传播感染&#xff0c;这款病毒被称为GandCrab勒索病毒的接班人&#xff0c;在短短几个月的时间内&#xff0c;已经在全球大…

缺陷检测:使用PatchCore训练自己的数据集

文章目录 前期准备两种方法 演示运行结果 代码详解见缺陷检测–PatchCore的代码解读 前期准备 必须包含有训练图片&#xff08;无缺陷图片&#xff09;、测试图片&#xff08;缺陷图片&#xff09;和ground_truth&#xff0c;并且ground_truth必须与对应图片的名称相同。 本文…

学习Java的第一天

一、Java简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出。 后来 Sun 公司被 Oracle &#xff08;甲骨文&#xff09;公司收购&#xff0c;Jav…

AI如何为人力资源服务?

组织的核心都是人力资源。从招聘到员工培养&#xff0c;再到评估员工绩效&#xff0c;人力资源&#xff08;HR&#xff09;在公司的持续发展中起着至关重要的作用。表面上看&#xff0c;这似乎是一个简单的任务。然而&#xff0c;实际上&#xff0c;这是世界上最复杂和最具挑战…

[数据结构初阶】栈

各位读者老爷好&#xff0c;鼠鼠我好久没写博客了&#xff08;太摆烂了&#xff09;&#xff0c;今天就基于C语言浅介绍一下数据结构里面的栈&#xff0c;希望对你有所帮助吧。 目录 1.栈的概念及结构 2.栈的实现 2.1定义栈 2.2.初始化栈 2.3.入栈 2.4.出栈 2.5.获取栈…

【Java EE初阶三十】JVM的简单学习

1. JVM 内存区域划分 一个运行起来的 Java 进程&#xff0c;就是一个 JVM 虚拟机&#xff0c;需要从操作系统申请一大块内存&#xff0c;就会把这个内存&#xff0c;划分成不同的区域&#xff0c;每个区域都有不同的作用. JVM 申请了一大块内存之后,也会划分成不同的内…

Git 基于ED25519、RSA算法生成 SSH 密钥

Git 基于ED25519、RSA算法生成 SSH 密钥 基于ED25519算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t ed25519 -C "邮箱地址"基于RSA算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t rsa -C "<注释内容>"基于ED255…

Day14:信息打点-主机架构蜜罐识别WAF识别端口扫描协议识别服务安全

目录 Web服务器&应用服务器差异性 WAF防火墙&安全防护&识别技术 蜜罐平台&安全防护&识别技术 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/…

【多模态融合】CRN 多视角相机与Radar融合 实现3D检测、目标跟踪、BEV分割 ICCV2023

前言 本文介绍使用雷达与多视角相机融合&#xff0c;实现3D目标检测、3D目标跟踪、道路环境BEV分割&#xff0c;它是来自ICCV2023的。 会讲解论文整体思路、输入数据分析、模型框架、设计理念、损失函数等。 论文地址&#xff1a;CRN: Camera Radar Net for Accurate, Robus…

如何使用 CSS object-fit 进行图片的缩放和裁剪

简介 在处理图片时&#xff0c;你可能会遇到需要保持原始宽高比的情况。保持宽高比可以防止图片被拉伸或压缩而出现失真。解决这个问题的常见方法是使用 background-image CSS 属性。更现代的方法是使用 object-fit CSS 属性。 在本文中&#xff0c;你将探索 object-fit CSS …

如何在有/没有备份的情况下恢复华为上已删除的视频?6 个推荐选项

“我不小心删除了华为手机上的一堆视频。我怎样才能把它们找回来&#xff1f;我在谷歌上也找不到它们”。——来自知乎 在我们日常生活的喧嚣中&#xff0c;意外时有发生。无论是由于华为手机上的无意删除、恢复出厂设置、病毒感染、数据损坏还是系统故障&#xff0c;这些视频…

GEE数据——GEDI04_A_和GEDI02_A_002_MONTHLY出现的数据问题

简介 产品介绍 该数据集包含全球生态系统动力学调查&#xff08;GEDI&#xff09;第 4A 级&#xff08;L4A&#xff09;第 2 版对地上生物量密度&#xff08;AGBD&#xff0c;单位为兆克/公顷&#xff09;的预测&#xff0c;以及对每个采样地理定位激光足迹内预测标准误差的估…

python+django高校澡堂洗浴浴室预约签到管理系统8d8c

本系统在设计过程中&#xff0c;高校洗浴管理系统的出现就有很大的需求。该系统可以很好地解决这些麻烦和问题。 很好地发挥了该开发方式的优势&#xff0c;让实现代码有了良好的可读性&#xff0c;而且使代码的更新和维护更加的方便&#xff0c;操作简单&#xff0c;对以后的维…

前端将html导出pdf文件解决分页问题

这是借鉴了qq_251025116大佬的解决方案并优化升级完成的&#xff0c;原文链接 1.安装依赖 npm install jspdf html2canvas2.使用方法 import htmlToPdffrom ./index.jsconst suc () > {message.success(success);};//记得在需要打印的div上面添加 idlet dom document.que…

文心一言 VS 讯飞星火 VS chatgpt (209)-- 算法导论15.4 6题

六、设计一个 O(nlgn) 时间的算法&#xff0c;求一个 n 个数的序列的最长单调递增子序列。&#xff08;提示&#xff1a;注意到&#xff0c;一个长度为 i 的候选子序列的尾元素至少不比一个长度为 i-1 候选子序列的尾元素小。因此&#xff0c;可以在输入序列中将候选子序列链接…

如何在Linux上为PyCharm创建和配置Desktop Entry

在Linux操作系统中&#xff0c;.desktop 文件是一种桌面条目文件&#xff0c;用于在图形用户界面中添加程序快捷方式。本文将指导您如何为PyCharm IDE创建和配置一个 .desktop 文件&#xff0c;从而能够通过应用程序菜单或桌面图标快速启动PyCharm。 步骤 1: 确定PyCharm安装路…

Nodejs 第五十二章(定时任务)

什么是定时任务&#xff1f; 定时任务是指在预定的时间点或时间间隔内执行的任务或操作。它们是自动化执行特定逻辑的一种方式&#xff0c;可用于执行重复性的、周期性的或计划性的任务。 定时任务通常用于以下情况&#xff1a; 执行后台任务&#xff1a;定时任务可用于自动…

Nodejs 第五十一章(限流阀)

限流功能 目前我们学习了redis,lua,nodejs&#xff0c;于是可以结合起来做一个限流功能&#xff0c;好比一个抽奖功能&#xff0c;你点击次数过多&#xff0c;就会提示请稍后重试&#xff0c;进行限制&#xff0c;我们来实现一下该功能。 安装依赖 npm i ioredis express代码…

『操作系统OS笔记』MAC(m1芯片)电脑安装FFmpeg

MAC(m1芯片)电脑安装FFmpeg mac电脑安装ffmpeg两种方法 文章目录 1. brew安装FFmpeg2. 官网下载FFmpeg压缩包3. 使用FFmpeg将音频和视频合并 1. brew安装FFmpeg brew install ffmpeg # 需要等比较久的时间&#xff0c;安装很多东西&#xff0c;安装过程中如果遇到报错对应解决…