当前位置: 首页 > news >正文

图像数字化基础

一、像素
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 cv2image = 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 cv2image = 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 cv2image = 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 cv2bgr_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 cv2bgr_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 cv2bgr_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 cv2bgr_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 cv2bgr_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 npn1 = np.array([1,2,3]) #创建一个简单的一维数组
n2 = np.array([0.1,0.2,0.3]) #创建一个包含小数的一维数组
n3 = np.array([[1,2],[3,4]]) #创建一个简单的二维数组
  • 创建浮点型数组
import numpy as nplist = [1,2,3]#创建浮点型数组
n1 = np.array(list,dtype=np.float_)
print(n1)
print(n1.dtype)
print(type(n1[0]))
  • 创建三维数组
import numpy as nplist = [1,2,3]
nd1 = np.array(list,ndmin=3)
print(nd1)
3、操作数组
  • 数组加、减、乘、除
import numpy as npn1 = 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 npn1 = np.array([1,2])
n2 = np.array([3,4])print(n1 ** n2)//输出:[ 1 16]
  • 比较运算
import numpy as npn1 = 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 npn1 = 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 npn1 = 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 npwidth = 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 npwidth = 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 npwidth = 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 npwidth = 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] = 255cv2.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 npimg = 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()
五、总结

相关文章:

  • python实现无人机航拍图片像素坐标转世界坐标
  • go语言:数据库sql查询保存任意数量字段的数据
  • yii2 ActiveForm使用技巧
  • DS:二叉树的链式存储及遍历
  • 解析Java中1000个常用类:AbstractSequentialList类,你学会了吗?
  • 视觉新纪元:解码LED显示屏的视角、可视角、最佳视角的最终奥秘
  • DDMA信号处理以及数据处理的流程---距离速度测量
  • 三目运算符中间的表达式可以省略吗(a?:c)?
  • 【pytorch01】简单回归问题
  • 空间复杂度 线性表,顺序表尾插。
  • 离线linux通过USB连接并使用手机网络
  • 初学者应该掌握的MySQL数据库的基本组成部分及概念
  • 【Docker】——安装镜像和创建容器,详解镜像和Dockerfile
  • 【Qt】QList<QVariantMap>中数据修改
  • ic基础|功耗篇03:ic设计人员如何在代码中降低功耗?一文带你了解行为级以及RTL级低功耗技术
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Date型的使用
  • ES6 学习笔记(一)let,const和解构赋值
  • Github访问慢解决办法
  • Invalidate和postInvalidate的区别
  • JAVA SE 6 GC调优笔记
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Next.js之基础概念(二)
  • NSTimer学习笔记
  • SQLServer之创建显式事务
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 前端面试之闭包
  • 微服务核心架构梳理
  • 怎么将电脑中的声音录制成WAV格式
  • 《码出高效》学习笔记与书中错误记录
  • mysql面试题分组并合并列
  • ​学习一下,什么是预包装食品?​
  • # Java NIO(一)FileChannel
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (算法)Game
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @JoinTable会自动删除关联表的数据
  • @RequestMapping-占位符映射
  • @staticmethod和@classmethod的作用与区别
  • [Android] Amazon 的 android 音视频开发文档
  • [bzoj2957]楼房重建
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [Cloud Networking] Layer 2
  • [flask] flask的基本介绍、flask快速搭建项目并运行