计算机视觉 | 八斗人工智能 (上)

news2024/11/15 7:17:24

目录

  • 数字图像
    • 像素和分辨率
    • 灰度、通道和对比度
    • 其他概念
  • 插值算法
    • 上采样和下采样的概念
      • 1. 最邻近插值
      • 2.双线性插值(最常用)
      • 3.双三次插值
  • 直方图均衡化
    • 1. 灰度图直方图均衡化
    • 2. 彩色图直方图均衡化

数字图像

像素和分辨率

像素
像素是分辨率的单位。像素是构成位图图像最基本的单元。

分辨率
图像分辨率 就是 单位英寸内的像素点数(PPI)
屏幕尺寸 指的是 对角线的长度
像素点数量:1920*1080
分辨率是指:PPI
两者不可混淆

灰度、通道和对比度

灰度
表示图像像素的明暗程度的数值,也就是黑白图像中点的颜色深度。白色为255,黑色为0

通道
在这里插入图片描述
对比度
指不同颜色之间的差别。 对比度=最大灰度值/最小灰度值

三原色
在这里插入图片描述
计算机中,数字计算机是光学三原色(RGB),美术上用的是色彩三原色(CMYK)

RGB转化为Gray
在这里插入图片描述
cv2中封装的函数: cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
很多图像识别将RGB图像灰度化。

RGB值(初始为[0,255]之间的整数值)转化为浮点数:
在这里插入图片描述

其他概念

频率:灰度值变化剧烈程度的指标
幅值:一个周期内交流电出现的瞬时最大值
数字图像: 计算机保存的图像都是一个一个的像素点,称为数字图像
取值: 要用多少点来描述一幅图像
量化:要使用多大范围的数值来表示图像采样之后的一个点

插值算法

上采样和下采样的概念

上采样:主要功能是放大原图像,可以显示在更高分辨率的显示设备上
原理:内插值

下采样:主要目的是:生成对应图像的缩略图
原理:插值 or (M/s)*(N/s)

1. 最邻近插值

cv2.resize函数的实现原理是图像插值,也称为图像重采样。它的目的是在图像的缩放、旋转、平移等变换中,将像素从原始位置移动到新位置,并生成新的像素值。在cv2.resize函数中,可以使用不同的插值方法,如最邻近插值、双线性插值、双三次插值等。其中,最邻近插值是一种简单的插值方法

它的原理如下:

首先确定目标图像上的一个像素位置,假设这个位置为(x, y);
计算出原始图像上的对应位置,假设为(x’, y’);
最邻近插值方法将原始图像上离(x’, y’)最近的像素的值赋给目标图像上的(x, y)位置。
也就是说,最邻近插值方法并不考虑离目标位置较远的像素,而是选择距离最近的像素来进行插值,因此它的计算速度非常快。但是,由于它没有考虑周围像素的权重,因此可能会产生锯齿状的边缘或明显的马赛克效应,特别是在图像缩放比例较大时。
除了最邻近插值方法之外,cv2.resize函数还支持双线性插值和双三次插值等更高级的插值方法。在实际应用中,我们需要根据具体的应用场景来选择合适的插值方法。

代码:

import cv2

def nearest_upsampling(img, scale):
    """
    实现RGB图像最邻近插值的上采样功能
    :param img: 原始图像,必须为RGB图像
    :param scale: 上采样比例
    :return: 上采样后的图像
    """
    # 获取原始图像的宽和高
    height, width, channels = img.shape

    # 计算上采样后的宽和高
    new_width = int(width * scale)
    new_height = int(height * scale)

    # 使用cv2.resize实现最邻近插值的上采样
    img_upsampled = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_NEAREST)

    return img_upsampled

使用方式:

# 读取图像
img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)

# 进行最邻近插值的上采样,比例为2
img_upsampled = nearest_upsampling(img, 2)

# 显示原始图像和上采样后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Upsampled Image', img_upsampled)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.双线性插值(最常用)

双线性插值是一种图像插值方法,它可以用于图像的缩放、旋转、平移等变换中。通俗来讲,就是在缩放或旋转图像时,使用周围4个像素的颜色信息来计算新像素的颜色值,以达到图像的平滑处理。双线性插值的原理就是先在水平方向上进行一次线性插值,然后在垂直方向上进行一次线性插值,将这两次插值的结果进行加权平均,得到最终的插值结果。这种方法比最邻近插值更平滑,而比双三次插值计算速度更快,因此在许多图像处理的应用场景中被广泛使用

代码:

import cv2

def bilinear_interpolation(img, scale):
    """
    实现双线性插值的上采样功能
    :param img: 原始图像
    :param scale: 上采样比例
    :return: 上采样后的图像
    """
    # 获取原始图像的宽和高
    height, width = img.shape[:2]

    # 计算上采样后的宽和高
    new_width = int(width * scale)
    new_height = int(height * scale)

    # 使用cv2.resize实现双线性插值的上采样
    img_upsampled = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)

    return img_upsampled

使用方法

# 读取图像
# cv2.IMREAD_COLOR是cv2.imread函数的一个参数,它的作用是告诉OpenCV以彩色图像的方式读取图像。
img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)

# 进行双线性插值的上采样,比例为2
img_upsampled = bilinear_interpolation(img, 2)

# 显示原始图像和上采样后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Upsampled Image', img_upsampled)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.双三次插值

双三次插值是一种高级的图像插值方法,它可以用于图像的缩放、旋转、平移等变换中。与双线性插值相比,双三次插值可以更加准确地保留原始图像的细节信息,从而在图像处理的应用场景中得到广泛应用。

双三次插值的原理

双三次插值的原理是在水平方向和垂直方向都进行三次插值,使用周围16个像素的颜色信息来计算新像素的颜色值。在三次插值的过程中,首先计算出相邻的四个像素的插值函数,然后再将这四个插值函数组合成一个整体的插值函数。这个整体插值函数的求解需要用到矩阵运算,因此计算复杂度较高,但是它可以在保持图像平滑的同时,尽可能地保留原始图像的细节信息。

代码实现:

import cv2

def upscale_image_bicubic(img, scale_factor):
    """
    使用双三次插值提高图像分辨率
    :param img: 原始图像
    :param scale_factor: 提高分辨率的倍数
    :return: 分辨率提高后的图像
    """
    # 获取原始图像的宽和高
    height, width = img.shape[:2]

    # 计算分辨率提高后的宽和高
    new_width = int(width * scale_factor)
    new_height = int(height * scale_factor)

    # 使用cv2.resize函数进行分辨率提高,采用双三次插值方式
    upscaled_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_CUBIC)

    return upscaled_img

使用方法如以上其他函数相同

直方图均衡化

图像的灰度直方图就是描述了图像灰度分布规律,它描述每个灰度级具有的像素个数
图像的灰度直方图不关系像素所处的空间位置,因此不受图像旋转和平移变化 的影响,可以作为图像的特征。
在这里插入图片描述
代码实现:

import cv2
import matplotlib.pyplot as plt

def plot_gray_histogram(img):
    """
    绘制灰度图像直方图
    :param img: 灰度图像
    :return: None
    """
    # 计算灰度图像的直方图
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])

    # 绘制直方图
    plt.plot(hist)

    # 设置x轴和y轴的标签和标题
    plt.xlim([0, 256])
    plt.xlabel('灰度值')
    plt.ylabel('像素数量')
    plt.title('灰度图像直方图')

    # 显示直方图
    plt.show()

import cv2

# 读取灰度图像   cv2.IMREAD_GRAYSCALE以灰度图读取
img = cv2.imread('tem.jpg', cv2.IMREAD_GRAYSCALE)

# 绘制灰度图像直方图
plot_gray_histogram(img)

直方图均衡化是将原图像的直方图通过变换函数变为均匀分布的直方图,然后按照均匀直方图修改原图像,从而获得一幅会的分布均匀的新图像,直方图均衡化就是用一定的算法使直方图大致平和的方法
其主要功能是 图像增强
在这里插入图片描述

1. 灰度图直方图均衡化

import cv2

def equalize_gray_hist(img):
    """
    灰度图直方图均衡化
    :param img: 灰度图像
    :return: 均衡化后的灰度图像
    """
    # 进行直方图均衡化
    equalized_img = cv2.equalizeHist(img)

    return equalized_img

2. 彩色图直方图均衡化

YUV格式:

在彩色图直方图均衡化中,我们只对Y通道进行直方图均衡化,而U和V通道保持不变。这是因为在YUV颜色空间中,Y通道代表亮度,而U和V通道代表色度,均衡化亮度通道能够增强图像对比度而不改变色度信息。

import cv2
import numpy as np

def equalize_color_hist(img):
    """
    彩色图直方图均衡化
    :param img: 彩色图像
    :return: 均衡化后的彩色图像
    """
    # 将图像转换为YUV格式
    yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)

    # 对Y通道(亮度)进行直方图均衡化
    yuv_img[:,:,0] = cv2.equalizeHist(yuv_img[:,:,0])

    # 将图像转换回BGR格式
    equalized_img = cv2.cvtColor(yuv_img, cv2.COLOR_YUV2BGR)

    return equalized_img

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

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

相关文章

智能营销服务性能提升2倍关键秘诀?就是亚马逊云科技

随着数字化进程加快和B2B商业市场竞争的白热化,通过挖掘数据“黄金”提升投资回报比与市场竞争力的智能营销,正成为B2B营销的热门风口。 但企业在获得更精准、更智能营销服务的同时,也不得不面临来自海量数据的搜寻以及数据实时更新等方面的…

Golang gorm

GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly. 一 对多入门 比如要开发cmdb的系统,无论是硬件还是软件。硬件对应的就是对应的哪个开发在用。或者服务对应的是哪个业务模块在使用,或者应用谁在使用。那么这…

【CXL】在gem5中跑一个实际的应用程序——Viper KV存储

有了CXL扩展内存,自然是要在DRAMCXL扩展内存上跑跑实际的应用程序,看看和DRAM传统磁盘有什么区别。 实际的应用程序其实就是一些工业界部署使用的,比如数据库、深度学习训练项目等等。本文主要找到一个KV存储Viper,搭建并进行简单…

水电设计院信息管理系统1.0

水电设计公司信息管理系统软件使用说明书 代码太多就不贴了,请在我的资源里下载,已部署在企业进行试运行。https://download.csdn.net/download/weixin_44735475/87704302 目录 1.引言 1 2.项目背景 1 3.系统功能 2 3.1系统功能 2 3.2系统性能 2 3.3系…

Python GUI自动化神器pyautogui,精准识别图片并自动点赞(32)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 你听过GUI自动化吗? GUI自动化就是用软件模拟鼠标和键盘的操作。 提到Python GUI自动化,不…

Flink State 笔记帖

1 State 分类 Operator State 主要用在Source、Sink等没有key分布的位置。 Keyed State 用在keyBy后的KeyedStream里,每个存储状态与一个key想关联。 ValueState ListState MapState ReducingState AggeratingState 2 State Backend StateBackend分类 HashMa…

JVM之JDK 监控和故障处理工具总结

JDK 命令行工具 这些命令在 JDK 安装目录下的 bin 目录下: jps (JVM Process Status): 类似 UNIX 的 ps 命令。用于查看所有 Java 进程的启动类、传入参数和Java 虚拟机参数等信息;jstat(JVM Statistics Monitoring Tool&#x…

虚拟人与娱乐传媒融合,推动综艺新模式

经过多年的更新迭代和市场的推动,虚拟人技术正在逐渐迈向成熟:3D虚拟形象的制作变得越来越精致且真实,并且出现了越来越多功能丰富使用便捷的动捕设备。因此,包括综艺影视在内的诸多领域,开始尝试将虚拟人技术融入行业…

DETR:end-to-end object detection with transformers

DETR 论文精读【论文精读】_哔哩哔哩_bilibili更多论文:https://github.com/mli/paper-reading/, 视频播放量 90699、弹幕量 493、点赞数 3566、投硬币枚数 2939、收藏人数 2564、转发人数 663, 视频作者 跟李沐学AI, 作者简介 ,相关视频:在线…

【设计原则】依赖倒置原则--高层代码和底层代码到底谁该依赖谁?

文章目录 前言一、谁依赖谁二、依赖于抽象总结 前言 依赖这个词,程序员们都好理解,意思就是,我这段代码用到了谁,我就依赖了谁。依赖容易有,但能不能把依赖弄对,就需要动点脑子了。 如果依赖关系没有处理…

【红队APT】反朔源隐藏C2项目CDN域前置云函数数据中转DNS转发

文章目录 域前置-CDN隐藏C2真实IP 防止被溯源什么是域前置条件原理 完整复现域前置溯源 DNS协议-域名记录解析云函数-腾讯云操作云函数如何溯源 端口转发-Iptables中间件反向代理-Apache 域前置-CDN隐藏C2真实IP 防止被溯源 国内外云服务上大部分已经不支持域前置了&#xff0…

局域网哪些特点?快解析内网穿透实现外网访问局域网SVN

无线局域网传统是有线局域网络的补充和扩展,具有灵活性、可移动性及较低的投资成本等优势,受到了家庭网络用户、中小型办公室用户、广大企业用户及电信运营商的青睐,成为当前整个数据通信领域发展最快的产业之一。 局域网一般为一个单位所建&…

(20230418 SALE算法)个人模型学习笔记记录 500

写给自己: 一、先不做对称的结构试一下,上一个ALE的模型,记得有次没有做对称结构,居然需要11天才能算完,当时吓得我赶紧删除了,做了对称结构。先试一下这个S-ALE能否不做成对称的。但是我感觉或许也会计算很长时间。要不我先试一下。 写给自己: 一、先不做对称的结构…

【UE 控件蓝图】通过键盘选中要点击的按钮 通过Enter键点击

上一篇【UE 控件蓝图】菜单及功能实现博客已经完成了菜单的制作,但是我们只能通过鼠标来点击菜单选项,本篇博客实现的是能够通过键盘的上下键来选中按钮,然后按下“Enter”键来实现点击按钮的效果。 效果 可以看到并没有移动鼠标也可以通过…

Node【Global全局对象】之【Console】

文章目录 🌟前言🌟Console模块🌟console对象方法🌟console.log()🌟console.dir()🌟console.time()🌟console.assert()🌟console.trace()🌟写在最后 🌟前言 哈…

升级数智化底座领先实践:北京地铁加速财务数智化转型

近年来,数字经济蓬勃发展,正在成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关键力量。中共中央、国务院印发的《数字中国建设整体布局规划》再次明确指出,做强做优做大数字经济。推动数字技术和实体经济深度融合,…

如何使用Postman做多接口测试【实战】

1. 摘要 本文讲解使用postman做接口测试和批量接口测试的方法。 2.实践内容 2.1 环境变量和全局变量的设置: a. 环境变量的设置方法如下图。点击设置一个环境变量,名为"user_pwd", 里面设置username 和passwd的值,然后在请求中…

gdb切换窗口焦点

为了辅助调试,一般会使用layout src,调起TUI显示代码: 然而这种情况下我们写命令很不方便,无法方便地使用上一条命令、退格等。 按动上下左右方向键盘只会移动代码框,然而在伪终端下,可以用鼠标滚轮来上下…

同步TMS-fMRI研究脑功能网络的指南

导读 经颅磁刺激(TMS)可直接激活人脑新皮层中的神经元,并已被证明是认知神经科学因果假设检验的基础。通过同时使用TMS和fMRI,皮层TMS对远端皮层和皮层下结构活动的影响可以通过改变TMS输出强度来量化。然而,TMS在fMRI时间序列中产生了显著的…

Google Earth Engine谷歌地球引擎GEE合并多个不同Asset的方法

本文介绍在GEE中,将多个存储有点要素的Asset加以合并,使得其成为一个Asset的方法。 本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第十五篇,更多GEE文章请参考专栏:GEE学习与应用…