图像数字化基础

news2024/10/23 2:38:45
一、像素
1、获取图像指定位置的像素
import cv2
image = cv2.imread("E:\\images\\2.png")
px = image[291,218]
print("坐标(291,218)上的像素的BGR值是:",px)
(1)RGB色彩空间
  • R通道:红色通道

  • G通道:绿色通道

  • B通道:蓝色通道

(2)RGB的表示

通常使用一个三维数组来表示一幅图像中某一个像素的RGB值

(3)RGB图像

RGB图像时指用RGB色彩空间显示的图像,BGR图像是指使用BGR色彩空间显示的图像;RGB色彩空间和

BGR色彩空间的区别是图像在RGB色彩空间中的通道顺序是R->G->B,在BGR的色彩空间中的通道顺序是

B->G-R

2、修改像素的BGR值

对于RGB/BGR图像,当每个像素的R、G、B这3个值相等时,就可以得到灰度图像。其中。

R=G=B=0(B=G=R=0)为纯黑色;R=G=B=255(B=G=R=255)为纯白色

import cv2

image = cv2.imread("E:/images/2.png")
cv2.imshow("2",image)

for i in range(241,292):
    for j in range(168,219):
        image[i,j] = [255,255,255]

cv2.imshow("3",image)
cv2.waitKey()
cv2.destroyWindow()
二、色彩空间
1、GRAY色彩空间
  • GRAY色彩空间通常指的是灰度图像,灰度图像是一种每个像素都是从黑到白,被处理为256个灰度级别的单

色图像。这256个灰度级别分别用区间[0,255]中的数值表示。其中“0”表示纯黑色,“255”表示纯白色,0~255之间

的数值表示不同的亮度(即色彩的深浅程度)的深灰色或浅灰色。因此,一幅灰度图像能够展示丰富的细节信息。

  • 从RGB/BGR色彩空间转换到GRAY色彩空间

dst  =  cv2.cvtColor(src,code)

    dst:转换后的图像
    src:转换前的初始图像
    code:色彩空间转换码
色彩空间转换码含义
cv2.COLOR_BGR2GRAY从BGR色彩空间转换到GRAY色彩空间
cv2.COLOR_RGB2GRAY从RGB色彩空间转换到GRAY色彩空间
import cv2

image = cv2.imread("E:/images/2.png")
cv2.imshow("2.1",image)

#将图像2.png从BGR色彩空间转换到GRAY色彩空间
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("GRAY",gray_image)
cv2.waitKey()
cv2.destroyWindow()
2、HSV色彩空间
  • HSV色彩空间是基于色调、饱和度和亮度而言的。其中,色调(H)是指光的颜色。在OpenCV中,色调在区间【0,180】内取值。例如,代表红色、黄色、绿色和蓝色的色调值分别为0、30、60和120

  • 从RGB/BGR色彩空间转换到HSV色彩空间

色彩空间转换码含义
cv2.COLOR_BGR2HSV从BGR色彩空间转换到HSV色彩空间
cv2.COLOR_RGB2HSV从RGB色彩空间转换到HSV色彩空间
import cv2

image = cv2.imread("E:/images/2.png")
cv2.imshow("2.1",image)

#将图像2.png从BGR色彩空间转换到GRAY色彩空间
hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow("HSV",hsv_image)
cv2.waitKey()
cv2.destroyWindow()
三、通道
1、拆分通道
  • 拆分一幅BGR图像中的通道
b,g,r = cv2.split(bgr_image)
参数说明:
   b:B通道图像
   g:G通道图像
   r: R通道图像
   bgr_image:一幅BGR图像 
import cv2

bgr_image = cv2.imread("E:/images/2.png")
cv2.imshow("2.1",bgr_image)

b,g,r = cv2.split(bgr_image)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)

cv2.waitKey()
cv2.destroyWindow()
  • 拆分一幅HSV图像中的通道
h,s,v = cv2.split(hsv_image)
参数说明:
   h:H通道图像
   s:S通道图像
   v:V通道图像
   hsv_image:一幅HSV图像 
import cv2

bgr_image = cv2.imread("E:/images/avatar.png")
cv2.imshow("2.1",bgr_image)

#把图2.1从BGR色彩空间转换到HSV色彩空间
hsv_image = cv2.cvtColor(bgr_image,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv_image)
cv2.imshow("H",h)
cv2.imshow("S",s)
cv2.imshow("V",v)

cv2.waitKey()
cv2.destroyWindow()
2、合并通道

合并通道是拆分通道的逆操作

  • 合并B、G、R通道图像

bgr = cv2.merge([b,g,r])
参数说明:
   bgr:按B->G->R的顺序合并通道后得到的图像
    r:R通道图像
    g:G通道图像
    b:B通道图像
    
注意:合并通道的顺序不同,图像的显示效果也不同
import cv2

bgr_image = cv2.imread("E:/images/avatar.png")
cv2.imshow("2.1",bgr_image)

b,g,r = cv2.split(bgr_image) #拆分图2.1中的通道

bgr = cv2.merge([b,g,r]) #按B->G->R的顺序合并通道
cv2.imshow("BGR",bgr)

rgb = cv2.merge([r,g,b]) #按R->G->B的顺序合并通道
cv2.imshow("RGB",rgb)

cv2.waitKey()
cv2.destroyWindow()
  • 合并H、S、V通道图像
hsv = cv2.merge([h,s,v])
参数说明:
   hsv:合并H通道图像、S通道图像和V通道图像后得到的图像
   h:H通道图像
   s:S通道图像
   v:V通道图像 
import cv2

bgr_image = cv2.imread("E:/images/avatar.png")
cv2.imshow("avatar.png",bgr_image)
#把图像avatar.png从RGB色彩空间转换到HSV色彩空间
hsv_image = cv2.cvtColor(bgr_image,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv_image) #拆分HSV图像中的通道
hsv = cv2.merge([h,s,v]) #合并拆分后的通道图像
cv2.imshow("HSV",hsv) #显示合并通道的HSV图像

cv2.waitKey()
cv2.destroyWindow()
3、alpha通道

BGR色彩空间包含3个通道,即B通道、G通道、R通道。OpenCV在这3个通道的基础上增加了一个A通道,即alpha通道,用于设置图像的透明度。alpha通道在区间【0,255】内取值;其中,0表示透明,255表示不透明

import cv2

bgr_image = cv2.imread("E:/images/avatar.png")
cv2.imshow("2.1",bgr_image)

#把图像2.1从BGR色彩空间转换到BGRA色彩空间
bgra_image = cv2.cvtColor(bgr_image,cv2.COLOR_BGR2BGRA)
cv2.imshow("BGRA",bgra_image) #显示BGRA图像
r,g,b,a = cv2.split(bgra_image)
a[:,:] = 172
bgra_172 = cv2.merge([r,g,b,a])
a[:,:] = 0
bgra_0 = cv2.merge([r,g,b,a])

cv2.imshow("A = 172",bgra_172)
cv2.imshow("A = 0",bgra_0)

cv2.waitKey()
cv2.destroyWindow()
四、使用NumPy模块操作像素
1、NumPy概述

NumPy提供了一个高性能的数组对象,可以轻松创建一维数组、二维数组和多维数组等大量实用方法,帮助开发者轻松地进行数组计算。从而广泛的应用于数据分析、机器学习、图像处理和计算机图形学、数学任务等领域中

2、创建数组
numpy.array(object,dtype,copy,order,subok,ndmin)
参数说明:
   object:任何具有数组接口方法的对象
   dtype:数据类型
   copy:可选参数,布尔型,默认值为True,则object对象被复制
   order:元素在内存中的出现顺序
   subok:布尔型。如果值为True,则将传递子类
   ndmin:指定生成数组的最小维数 
  • 创建一维和二维数组
import numpy as np

n1 = np.array([1,2,3]) #创建一个简单的一维数组
n2 = np.array([0.1,0.2,0.3]) #创建一个包含小数的一维数组
n3 = np.array([[1,2],[3,4]]) #创建一个简单的二维数组
  • 创建浮点型数组
import numpy as np

list = [1,2,3]

#创建浮点型数组
n1 = np.array(list,dtype=np.float_)
print(n1)
print(n1.dtype)
print(type(n1[0]))
  • 创建三维数组
import numpy as np

list = [1,2,3]
nd1 = np.array(list,ndmin=3)
print(nd1)
3、操作数组
  • 数组加、减、乘、除
import numpy as np

n1 = np.array([1,2])
n2 = np.array([3,4])

print(n1 + n2)
print(n1 - n2)
print(n1 * n2)
print(n1 / n2)

//输出
[4 6]
[-2 -2]
[3 8]
[0.33333333 0.5       ]
  • 幂运算
import numpy as np

n1 = np.array([1,2])
n2 = np.array([3,4])

print(n1 ** n2)

//输出:[ 1 16]
  • 比较运算
import numpy as np

n1 = np.array([1,2])
n2 = np.array([3,4])

print(n1 >= n2)
print(n1 == n2)
print(n1 <= n2)
print(n1 != n2)

//输出
[False False]
[False False]
[ True  True]
[ True  True]
  • 复制数组
import numpy as np

n1 = np.array([1,2])
n2 = n1.copy()

print(n1 == n2)
n2[0] = 9
print(n1)
print(n2)
print(n1 == n2)

//输出
[ True  True]
[1 2]
[9 2]
[False  True]
  • 索引和切片
import numpy as np

n1 = np.array([1,2,3])
print(n1[0])
print(n1[1])
print(n1[0:2])
print(n1[1:])
print(n1[:2])

//输出
1
2
[1 2]
[2 3]
[1 2]
4、创建图像

在OpenCV中,黑白图像实际是一个二维数组,彩色图像是一个三维数组。数组中每个元素就是图像对应位置的像素值。因此修改图像像素的操作实际就是修改数组的操作

注意:数组索引、像素行列、像素坐标的关系如下
   数组行索引 = 像素所在行数 - 1 = 像素纵坐标
   数组列索引 = 像素所在列数 - 1 = 像素横坐标 
  • 创建纯黑色图像
import cv2
import numpy as np

width = 200
height = 100

#创建指定宽度、高度、像素值都为0的图像
img = np.zeros((height,width),np.uint8) #用0填充数组
cv2.imshow("img",img)

cv2.waitKey()
cv2.destroyWindow()
  • 创建纯白色图像
import cv2
import numpy as np

width = 200
height = 100

#创建指定宽度、高度、像素值都为1的图像
img = np.ones((height,width),np.uint8)*255 #用1填充数组,然后再乘以255
cv2.imshow("img",img)

cv2.waitKey()
cv2.destroyWindow()
  • 在黑色图像内部绘制白色矩形
import cv2
import numpy as np

width = 200
height = 100

#创建指定宽度、高度、像素值都为0的图像
img = np.zeros((height,width),np.uint8) #用0填充数组
# 图像纵坐标为25~75、横坐标为50~100之间的区域变为白色
img[25:75,50:100] = 255
cv2.imshow("img",img)

cv2.waitKey()
cv2.destroyWindow()
  • 创建彩色图像
import cv2
import numpy as np

width = 200
height = 100

#创建指定宽度、高度、像素值都为0的图像
img = np.zeros((height,width,3),np.uint8) #用0填充数组
blue = img.copy()
blue[:,:,0] = 255
green = img.copy()
green[:,:,1] = 255
red = img.copy()
red[:,:,2] = 255

cv2.imshow("blue",blue)
cv2.imshow("green",green)
cv2.imshow("red",red)

cv2.waitKey()
cv2.destroyWindow()
5、图像拼接
  • 水平拼接数组

array  =  numpy.hstack(tup)
参数说明:
   tup:要拼接的数组元组
返回值说明:
   array:将参数元组中的数组水平拼接后生成的新数组
  • 垂直拼接数组
array = numpy.vstack(tup)
参数说明:
   tup:要拼接的数组元组
返回值说明:
   array:将参数元组中的数组垂直拼接后生成的新数组
  • 拼接图像
import cv2
import numpy as np

img = cv2.imread("E:/images/avatar.png")

img_h = np.hstack((img,img))
img_v = np.vstack((img,img))

cv2.imshow("img_h",img_h)
cv2.imshow("img_v",img_v)

cv2.waitKey()
cv2.destroyWindow()
五、总结

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

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

相关文章

LVS(Linux Virtual Server)集群,(1)NAT模式

Cluster&#xff1a;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 集群分为三种类型&#xff1a; LB(Load Balancing)&#xff0c;负载均衡&#xff0c;多个主机组成&#xff0c;每个主机只承担一部分访问请求 HA(High Availiablity)&#xf…

网工内推 | H3C工程师,大专可投,无责底薪加提成

01 内蒙古华贸信息科技有限公司 &#x1f537;招聘岗位&#xff1a;H3C工程师 &#x1f537;岗位职责&#xff1a; 1、负责核心网络的7*24小时网络运维&#xff0c;可持续对网络进行优化&#xff0c;提供高质量的网络服务&#xff1b; 2、能够独立运维高端核心设备和楼层接入网…

Premiere Pro 关键帧的运用(光盘滚入盘盒)

制作“光盘滚入盘盒”效果&#xff0c;步骤如下&#xff1a; 1.新建项目>新建序列&#xff0c;项目名称为“光盘滚入盘盒”&#xff0c;序列设置如下图所示。 2.导入素材到项目面板中。 3.新建“颜色遮罩 ”。在项目面板中&#xff0c;右键【新建项目】-【颜色遮罩】-【视…

idea2023开发插件入门

idea2023开发插件入门 创建工程 通过 idea plugin 来创建工程 修改 开发语言 默认创建的工程是用scala开发的&#xff0c;但是我不会&#xff0c;就会java,所以改成java创建 build.gradle.kt 为 build.gradlesettings.gradle.kt 为 settings.gradle build.gradle修改为以…

css实现多行文本的展开收起

背景 在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景&#xff1a; 那么&#xff0c;如何通过纯css实现这样的效果呢&#xff1f; 实现的难点 &#xff08;1&#xff09;位于多行文本右下角的 展开收起按钮。 &#xff08;2&#xff09;展开和收起两种状态的…

Linux--视频推流及问题

方案一&#xff1a; mjpg-streamer,它运行在ARM板上 在手机上使用浏览器直接观看视频 方案二&#xff1a; 推流端&#xff08;Fmpeg&#xff09;--rtmp-->Nginx&#xff08;流媒体服务器&#xff09;--rtmp/httpflv/hls-->浏览器、播放器 此篇文章记录方案二的具体细…

理解HTTP请求格式

HTTP概念 HTTP全称HyperTextTransfer Protocol(超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议&#xff1b;HTTP是一个客户端&#xff08;用户&#xff09;和服务端&#xff08;网站&#xff09;之间请求和响应的标准。 HTTP 协议是以 ASCII 码传输&…

IDEA 运行 ‘xxx‘ 时出错. 命令行过长. 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行.

IDEA 运行 ‘xxx’ 时出错. 命令行过长. 通过 JAR 清单或通过类路径文件缩短命令行&#xff0c;然后重新运行. 目录 IDEA 运行 xxx 时出错. 命令行过长. 通过 JAR 清单或通过类路径文件缩短命令行&#xff0c;然后重新运行.报错解决方案jar清单jar清单 报错原因&#xff1a;1.使…

可预约上门服务的在线DIY预约小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 这款可预约上门服务的在线 DIY 预约小程序源码系统是为满足各类上门服务需求而设计的。它允许用户通过小程序方便地预约各种服务&#xff0c;如家政服务、维修服务、美容美发服务等。同时&#xff0c;商家可以在后台管理系统中方便地管理预约信息、服务项目、员工信息…

数据链路层知识分享【计算机网络】【以太网帧 | MTU的影响 | ARP技术】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 前文 一&#xff0c; 以…

贝叶斯优化、高斯过程相关概念总结

目录 贝叶斯优化 高斯过程 采集函数 贝叶斯优化 贝叶斯优化 &#xff5c; 黑盒优化全局最优方法 &#xff5c; Bayesian Optimization_哔哩哔哩_bilibili 贝叶斯优化用于解决寻找某个函数的最大值/最小值&#xff0c;在自变量维度比较小时(<20)表现的非常好。 适用…

嵌入式系统软件开发环境_2.一般架构

1.Eclipse框架 嵌入式系统软件开发环境是可帮助用户开发嵌入式软件的一组工具的集合&#xff0c;其架构的主要特征离不开“集成”问题&#xff0c;采用什么样的架构框架是决定开发环境优劣主要因素。Eclipse框架是当前嵌入式系统软件开发环境被普遍公认的一种基础环境框架。目…

OCC介绍及框架分析

1.OCC介绍 Open CASCADE &#xff08;简称OCC&#xff09;是一开源的几何造型引擎&#xff0c;OCCT库是由Open CASCADE公司开发和市场运作的。它是为开源社区比较成熟的基于BREP结构的建模引擎&#xff0c;能够满足二维三维实体造型和曲面造型&#xff0c;国内研究和使用它的单…

NodeJs 连接本地 mySql 数据库获取数据

写在前面 今天把 nodejs 连接本地数据库的坑简单的踩一下&#xff0c;为后续写接口做个铺垫 安装 mySql &#xff08;mac举例子&#xff09; 安装地址 安装完成大概这个样子&#xff0c;起动起来就行 安装本地数据库连接工具&#xff08;navicat举例子&#xff09; 安装地…

RISC_CPU模块的调试

代码&#xff1a; cpu.v include "clk_gen.v" include "accum.v" include "adr.v" include "alu.v" include "machine.v" include "counter.v" include "machinectl.v" include "register.v&quo…

探索Linux命令的新利器:linux-command

在Linux操作系统中&#xff0c;熟练掌握各种命令是成为一名高效开发者或管理员的关键。然而&#xff0c;即使是经验丰富的用户&#xff0c;有时也会遇到命令用法不熟悉或者记忆模糊的情况。这时&#xff0c;一个功能强大的命令搜索工具就显得格外重要。最近在逛github的时候正好…

Qemu虚拟机在线迁移到VMware

libvirt版本&#xff1a;libvirt-10.0.0qemu版本&#xff1a;qemu-8.2.0 在生产环境中&#xff0c;大多数的场景是 vmware 虚拟机迁移到 qemu 环境&#xff0c;一般是通过关机然后导出、导入磁盘镜像来实现。 如果要将 qemu 环境虚拟机迁移到 vmware 怎么办呢&#xff1f;要求…

Ruby on Rails Post项目设置网站初始界面

在构建了Ruby的Web服务器后&#xff0c;第三步就可以去掉框架的官方页面&#xff0c;设置自己的网页初始页了。 Linux系统安装Ruby语言-CSDN博客 、在Ubuntu中创建Ruby on Rails项目并搭建数据库-CSDN博客、 Ruby语言建立Web服务器-CSDN博客 了解Ruby onRails项目中的主要文件…

go语言对接S3存储的SDK(支持minio和OSS)

背景 在某个项目中&#xff0c;客户要求支持S3协议的存储&#xff0c;因为之前的项目是go来开发的支持的oss和minio 。 但并不一定支持S3的协议&#xff0c;而且使用了二种SDK&#xff0c;感觉比较麻烦。 既然客户提出来了要求。那我们改一下就是了。 操作 引入 go语言中有对…

《计算机英语》Unit1 计算机概述

期末试卷组成 1、选择20道 2、判断20道 3、词汇翻译&#xff08;单词词组&#xff0c;参照课后习题&#xff09; 4、翻译2道&#xff08;一道原题&#xff0c;参照作业&#xff09; Unit One Computer Overview 单元1 计算机概述 algorithm n. 算法 operate …