03:像素的基本操作

像素是图像的最小单位,每一幅图像都是由N行M列的像素组成的,其中每一个像素都存储一个像素值。

以灰度图为例,计算机通常把灰度图像的像素处理为256个灰度级别,256个灰度级别分别使用区间[0,255]中的整数数值表示。其中“0”表示纯黑色,“255”表示纯白色

图像是有许多小方块组成,通常把一个小方块称作一个像素,因此一个像素是具有一定面积的小块,而不是一个点。需要注意的是像素的形状是不固定的,大多数数况下,像素被认为是方形的,但有时也可能是圆形的或者其他形状的。

1.确定像素的BGR值

如果我们想知道某一个像素点的值,此时我们就需要先确定该像素点的位置,然后再查看它的值

(1.1)如果确定某个像素的位置

我们可以使用windows自带的画图工具打开图像,以此来查看图像中某一个像素点的位置

(1.2)查看[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3MGYor9M-1676597842631)(C:\Users\hanhan\Desktop\模型学习\opencv–pil\opencv\03像素的操作\像素操作.assets\image-20221130162314384.png)]查看某个像素点对应的BGR值

import cv2
image = cv2.imread("C:/Users/hanhan/Desktop/image/1.jpg",1)
px =image[235,234] #查看(235,234)位置像素的RGB值
print(px)

输出结果是[233,235,245]

如何理解上面的RGB输出结果?

三基色:人眼能够感知红色,绿色和蓝色三种不同的颜色,因此把这三种颜色称作三基色。如果将这三种颜色以不同的比例进行混合,人眼就能够感知到丰富多彩的颜色。

那么对于计算机是如何对这些颜色进行编码的呢?

答案就是利用色彩空间,也就是色彩空间是计算机对颜色进行编码的模型。

以较为常用的RGB色彩空间为例,在RGB色彩空间中,存在三个通道即R通道,G通道,B通道,其中R通道是红色通道,G通道是绿色通道,B通道是蓝色通道,并且每个色彩通道都是在区间[0,255]内取值。

这样,计算机将利用三个色彩通道的不同组合来表示不同的颜色

我们常常使用功能RGB的顺序来表示色彩空间,但是在opencv中则使用BGR顺序来表示色彩空间,

即【233,235,245】

233:是蓝色通道

235:是绿色通道

245:是红色通道

(1.3)如何查看每个通道的值

import cv2
image = cv2.imread("C:/Users/hanhan/Desktop/image/1.jpg",1)
px =image[235,234,0] #查看(235,234)位置的像素的B通道值
px =image[235,234,1] #查看(235,234)位置的像素的G通道值
px =image[235,234,2] #查看(235,234)位置的像素的R通道值
其实跟索引差不多
print(px)

2.修改像素的BGR值

(2.1) 修改单个像素点的BGR值

前面我们已经获取像素(235,234)位置的像素值为【233,235,245】,现在我们把像素值全部变成【255,255,255】

import cv2
image = cv2.imread("C:/Users/hanhan/Desktop/image/1.jpg",1)
px =image[235,234] #查看(235,234)位置的像素RGB值
px = [255,255,255] #s使用同一个px变量,进行修改
print(px)

对于BGR色彩空间的图像,当每个像素的BGR的三个数值相等时,就可以得到灰度图像。其中B=G=R=0为纯黑色。B=G=R=255为纯白色。

(2.2)修改指定区域内的像素值

将像素坐标为(241,168),(241,218),(291,168),(291,218)d的4个点所围成的区域内的所有像素都修改为纯白色

241表示横坐标

168表示纵坐标

import cv2
image = cv2.imread("C:/Users/hanhan/Desktop/image/1.jpg",1)
cv2.imshow("e",image)
for i in range(241,291):
	for j in range(168,219):
		image[i,j] = [255,255,255]
cv2.imshow("4,8",image)
cv2.waitKey()
cv2.destroyAllWindows()

3.使用numpy操作像素

图像在open CV中以二维或三维数组表示,数组中的每一个值就是图像的像素值。善于操作数组的numpy模块就成了open CV的依赖包。

1.创建数组

(1.1)最常规的array()方法

numpy创建简单的数组主要是用array()方法,通过传递列表,元祖,来创建numpy数组,元素可以是任何对象

numpy.array(object,dtype,copy,order,subok,ndmin)

object:任何具有数组接口方法的对象
dtype:数据类型
copy:可选参数,布尔型,默认值为True,则object对象被复制,否则,只有当__array__返回副本,object参数为嵌套序列,或者需要副本满足数据类型和顺序的要求时,才会产生副本
order:元素在内存中出现的顺序,其值为K,A,C,F。如果object参数不是数组,则新建的数组将按行排列(C),如果值为F,则按列排列,如果Object参数是一个数组,则以一下顺序成立C(按行),F(按列),A(原顺序),K(元素在内存中出现的顺序)
subok:布尔型,如果为True则传递子类,否则返回的数组,将强制为基类数组
ndmin:指定生成数组最小的维数
import numpy as np
#创建一维数组
n1 = np.array([1,2,3])
#创建二维数组
n2 = np.array([[1,2],[3,4]])
#创建浮点类型的数组
list = [1,2,3]
n3 = np.array(list,dtype=float)
dtype:可以指定创建数组的数据类型
#创建指定的维度的数组
list= [2,3,4]
n3d = np.array(list,ndmin=3)

(1.2)创建一个指定维度和数据未初始化的数组

import numpy as np
n = np.empty([2,3])

(1.3)创建用0填充的数组

import numpy as np
n = np.zeros((3,3),np.uint8)
创建的是3行3列,数字类型为无符号8位整数的纯0数组

(1.4)创建用1填充的数组

import numpy as np
n = np.ones((3,3),np.uint8)
创建的是3行3列,数字类型为无符号8位整数的纯0数组

(1.5)创建随机数组

numpy.random.randint(low,high,size)

randint()方法用于生成一定范围内的随机整数数组,左闭右开(【low,high) )

low:随机数最小的取值范围

high:可选参数随机数最大取值范围,若high为空,取值范围为(0,low),若high不为空,则high必须大于low

size:可选参数,数组维数

import numpy as np
#随机生成10个1-3不包括3的整数
n1 = np.random.randint(1,3,10)
#size数组大小为空时,随机返回一个整数
n2 = np.random.randint(5,10)
#随机生成5以内二维数组
n3 = np.random.randint(5,size=(2,5))

2.操作数组

大小相等的数组之间的任何算术运算都可以使用Numpy实现

2.1加法运行

import numpy as np
n1 = np.array([1,2])
n2 = np.array([3,4])
print(n1+n2)

2.2减法和乘除运算

import numpy as np
n1 = np.array([1,2])
n2 = np.array([3,4])
print(n1-n2)
print(n1 * n2)
print(n1 / n2)
对于应位置相乘除

2.3幂运算

幂是数组中对应位置元素的幂运算,使用**运算符进行运算

import numpy as np
n1 = np.array([1,2])
n2 = np.array([3,4])
print(n1 ** n2)

2.4.比较运算

numpy 创建的数组可以使用逻辑运算符进行比较运算,运算的结果是布尔值数组,数组中的布尔值为相比较的数组在相同位置元素的比较结果

import numpy as np
n1 = np.array([1,2])
n2 = np.array([3,4])
print(n1 >= n2)
print(n1 != n2)

2.5复制数组

n2 = n1.copy()
修改副本中的元素不会影响到原数组

3.数组的索引和切片

数组中的索引是从0开始的,第一个元素的索引为0

切片

数组的切片可以理解为对数组的分割,按照等分或者不等分,将一个数组切割为多个片段

[start:stop:step]
start:起始索引,若不写任何值,则表示从0开始的全部索引
stop:终止索引,若不写任何值,则表示知道末尾的全部索引
step: 步长
支持左闭右开的原则
import numpy as np
n1 = np.array([1,2,3])
print(n1[1:]) #结果是【2,3】
print(n1[:2]) #结果是【1,2】

start,stop,step这3个参数都可以是负数,代表反向索引

正向索引 : 0   1  2  3  4  5  6  7  8  9 
原数据数据  0   1  2  3  4  5  6  7  8  9 
反向索引 :-10 -9 -8 -7 -6 -5 -4 -3 -2 -1
import numpy as np
n1 = np.array([1,2,3,4,5,6,7,8,9])
print(n1[::-1]) #从9到1
print(n1[::]) #从1到9

二维数组索引

二维数组索引可以使用array(n,m)的形式

二维数组的切片

import numpy as np
n1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(n1[1,:2]) #前控制行,后控制列,第二行的,第一个列,第二列,[4,5]
print(n1[:2,1:]) 
print(n1[:,:1]) #所有的行,但是只有第一列

4.创建图像

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

1.创建纯黑图像

创建一个100行,200列(宽200,高100)的数组,数组元素格式为无符号8位整数,用0填充整个数组

import cv2
import numpy as np
width = 200
height = 100
#创建指定宽高,单通道,像素值都为0的图像
img = np.zeros((height,width),np.uint8)
cv2.imshow("ing",img)
cv2.waitKey()
cv2.destroyAllWindows()

2.创建纯白图像

创建纯白图像有两种方式:

第一种:先纯黑图像,然后将图像中所有的像素值改为255

第二种:使用numpy提供的ones()方法创建一个像素值均为1的数组,然后让数组乘以255

第二种方法

import cv2
import numpy as np
width = 200
height = 100
#创建指定宽高,单通道,像素值都为0的图像
img = np.ones((height,width),np.uint8)*255
cv2.imshow("ing",img)
cv2.waitKey()
cv2.destroyAllWindows()

3.在黑色图像内部绘制白色矩形

通过索引切片操作可以修改图像中指定区域内的像素,从而达到修改图像内容的效果

先绘制纯黑色图像作为背景,然后使用切片式索引操作将图像中横坐标为50-100,纵坐标为25-75的矩形区域颜色改为纯白色

import cv2
import numpy as np
width = 250
height = 100
#创建指定宽高,单通道,像素值都为0的纯黑色图像
img = np.zeros((height,width),np.uint8)
#将图像纵坐标为25-75,横坐标为50-100的区域改为白色
img[25:75,50:100] = 255
cv2.imshow("ing",img)
cv2.waitKey()
cv2.destroyAllWindows()

4.创建黑白相间的图像

其实就是将切片索引放入了循环内,则可以绘制带有规律的几何图像

先绘制纯黑色图像作为背景,然后再循环中使用切片式索引操作绘制黑白间隔图像

import cv2
import numpy as np
width = 200
height = 100
#创建指定宽高,单通道,像素值都为0的纯黑色图像
img = np.zeros((height,width),np.uint8)
for  i in range(0,width,40):  #40是步伐
    img[:,i:i+20] =255
cv2.imshow("ing",img)
cv2.waitKey()
cv2.destroyAllWindows()

5.创建彩色图像

创建彩色图像时要将数组建成三维数组,元素类型仍然为无符号8位整数,创建好表示纯黑色图像的三维数组后,复制出3个副本,3个副本分别修改最后一个索引代表的元素值,根据BGR的时序,0表示蓝色分量,1表示绿色分量,2表示红色分量,让3个副本分别表示纯蓝,纯绿,和纯红

import cv2
import numpy as np
width = 200
height = 100
#创建指定宽高,单通道,像素值都为0的纯黑色图像
img = np.zeros((height,width,3),np.uint8)
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.destroyAllWindows()

6.创建随机像素的雪花点图像

使用numpy提供的random.randint()方法可创建随机数组,将随机值的取值范围设定在0-255(即像素值范围),元素类型设定为无符号8位整数

这个创建的是二维黑白图像
import cv2
import numpy as np
width = 200
height = 100
img = np.random.randint(256,size = (height,width),dtype = np.uint8)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
#创建彩色图像
import cv2
import numpy as np
width = 200
height = 100
#创建指定宽高,单通道,像素值都为0的纯黑色图像
img = np.random.randint(256,size = (height,width,3),dtype = np.uint8) #只是在后面加了个3
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

5.拼接图像

numpy提供了两种拼接数组的方法,分别是hstack()方法和vstack()方法,

1.水平拼接数组

hstack()可以对数组进行水平拼接(或叫横向拼接)

array = numpy.hstack(tup)

tup:要拼接的数组元组

返回值说明:array:将参数元组中的数组水平拼接后生成的新数组

hstack()方法,可以拼接成多个数组,但拼接的数组,他们的形状一定要相同

#一维数组的拼接
import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
result = np.hstack((a,b,c))
print(result)
#一维数组拼接后会生成一个较长的,包括所有元素的数组

2.垂直拼接数组

vstack()可以对数组进行垂直拼接(或叫纵向拼接)

array = numpy.vstack(tup)

tup:要拼接的数组元组

返回值说明:array:将参数元组中的数组水平拼接后生成的新数组

hstack()方法,可以拼接成多个数组,但拼接的数组,他们的形状一定要相同

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
result = np.vstack((a,b,c))
print(result)
#一维数组进行垂直拼接后,生成一个三维数组

3.在图像处理中的应用

在opencv中图像就是一个二维或三维的像素数组,这些数组同样可以被numpy拼接

按照水平和垂直两种方式拼接两幅图像

import cv2
import numpy as np
image = cv2.imread("C:/Users/hanhan/Desktop/image/1.jpg",1)
img_h = np.hstack((image,image))
img_v = np.vstack((image,image))
cv2.imshow("img_h",img_h)
cv2.imshow("img_v",img_v)
cv2.waitKey()
cv2.destroyAllWindows()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,提供了许多基本的图像处理计算机视觉功能。以下是一些OpenCV基本操作: 1. 获取并修改图像像素点可以通过行和列的坐标值来获取该像素点像素值。对于BGR图像,返回一个蓝、绿,红的数组,对于灰度图像,仅返回相应的强度值。 2. 获取图像的属性有三个常用的属性: - 形状:img.shape - 图像大小:img.size - 数据类型:img.dtype 3. 图像通道的拆分与合并: - 拆分:使用cv.split()函数,可以将图像的通道拆分为单独的通道。例如,b,g,r = cv.split(img)将图像的蓝色通道、绿色通道和红色通道分别拆分为b,g,r三个变量 - 合并:使用cv.merge()函数,可以将单独的通道合并为一个图像。例如,img = cv.merge((b,g,r))将三个通道的变量b,g,r合并为一个图像 4. 色彩空间的改变: - 使用cv.cvtColor()函数可以将图像的色彩空间进行转换。例如,将BGR图像转换为灰度图像可以使用cv.cvtColor(input_image, cv.COLOR_BGR2GRAY) 5. 图像的加法: - OpenCV的加法是饱和操作,可以使用cv.add()函数进行图像的加法运算。注意,图像的大小应该保持一致 6. 图像的混合: - 使用cv.addWeighted()函数可以将两幅图像按照不同的比例进行混合。注意,图片的权重之和应为1 7. 图像显示: - 可以使用cv.imshow()函数来显示图像。例如,定义一个图像显示函数cv_show(name, img),然后使用cv_show(name, img)来显示图像 8. 图像的边缘复制: - 使用cv.copyMakeBorder()函数可以对图像进行边缘复制。例如,使用复制法复制最边缘像素可以使用cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE) 这些是OpenCV的一些基本操作,它们可用于图像的处理和计算机视觉任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [OpenCV基本操作](https://blog.csdn.net/qq_42627691/article/details/120283042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Opencv的基础操作](https://blog.csdn.net/m0_51864191/article/details/128243407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值