03:像素的基本操作

这篇具有很好参考价值的文章主要介绍了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拼接

按照水平和垂直两种方式拼接两幅图像文章来源地址https://www.toymoban.com/news/detail-824251.html

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()

到了这里,关于03:像素的基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包