目录
接着笔记01继续总结,当我们读取一幅图像的时候,一般为二值图像、灰度图像、彩色图像。二值图像就是组成图像的像素非黑即白,只有两种取值,在double类型中0代表黑,1代表白。uint8的话则是0代表黑,255代表白,如果图像的像素不仅有两种颜色组成,还有白色和黑色的之间的灰色,即把白色和黑色之间分成若干段,每段代表的灰度都不同,这时表现出来的图像就是灰度图像。彩色图像则是色彩上给人的冲击是不一样,比如rgb彩色图像,由三个通道组成,每一个彩色像素值是由三个通道上的各个对应的像素值叠加而成呈现出来的颜色。
(一)、灰度图像像素处理
这里先把用上的lena灰度图像放出来,以便大家进行实践。如下图所示。
思路:
第一步:先把读取文件,然后显示其由像素组成数值矩阵,显示原图像。
第二步:访问原图像矩阵中的某个像素值或某些像素值,然后对这些像素值进行修改
第三步:显示修改之后的图像和修改之后的像素值。
代码如下:
import cv2
# 读取灰度图像,然后对像素值和图像显示,然后修改之后显示修改之后的图像和像素
filename = r'C:\Users\LBS\Desktop\lenagray.png'
# 读取图像
f = cv2.imread(filename)
# 显示图像,one是显示图像的窗口的名字
cv2.imshow('one', f)
# 打印图像对应的像素值的矩阵
print(f)
# 利用for循环对原图像的第10行到第99行,第80列到第99列的像素值改为255,
for i in range(10,100):
for j in range(80,100):
f[i, j] = 255
# two代表修改后的图像
cv2.imshow('two', f)
print('f(10:100, 80:100)={0}'.format(f[10:100, 80:100]))
# 按下任意键关闭图像窗口
cv2.waitKey()
cv2.destroyAllWindows()
结果:
左图是原图像,右图是我们修改之后的,可以看出出现了长方形的白框,这是因为我们赋值了像素值255。
输出的像素结果为:
修改之后的那部分都变成了255。
(二)、彩色图像像素处理
将rgb彩色图像读入到opencv内进行处理时,第一层第二层第三层分别对应b通道、g通道、r通道,和matlab处理时的通道对应顺序刚好相反。但不影响我们对各个通道进行操作。加入一张图片为f,则f[:,:,0], f[:,:,1],f[:,:,2]就对应了图像的b通道、g通道、r通道的像素值,也可以利用cv2.split(f)[0],cv2.split(f)[1],cv2.split(f)[2],获得三个通道。每一个通道我们又可以看作是灰度图像对应的像素值矩阵。
图像f[x,y,z]中x代表图像的行,y代表图像的列,z代表的某一通道,若为f[x,y],则是对应的三个通道,打印输出的x行y列有三个值
思路:
第一步:先获取彩色图像的三维的数组。如有必要,再获取各个通道的像素值二维数组
第二步:然后通过访问三维数组的像素值对其像素进行修改。
第三步:显示像素值被修改后的图像,以及打印出修改的像素的值信息。
对应代码:
import numpy as np
import cv2
# 读取彩色图像
filename = r'C:\Users\LBS\Desktop\lena.jpg'
f = cv2.imread(filename)
# 显示彩色图像
cv2.imshow('01', f)
print("修改像素之前,个别像素对应的像素值\n")
# 图像f[x,y,z]中x代表图像的行,y代表图像的列,z代表的某一通道,若为f[x,y],则是对应的三个通道,打印输出的x行y列有三个值
print("f[0, 0]=\n", f[0, 0])
print("f[50,0]=\n", f[50, 0])
print("f[100,0]\n", f[100, 0])
# 对彩色图像的像素进行处理,这里的三重for循环是对三个通道的值都进行修改
for i in range(0, 50):
for j in range(0, 100):
for k in range(0, 3):
f[i, j, k] = 255
for i in range(50, 100):
for j in range(0, 100):
for k in range(0, 3):
f[i, j, k] = 128
# 如果没有指定对0、1、2、中的哪个通道对应的像素值进行修改时,则同时修改的是三个通道对应的像素值,三个通道都被修改为相同的值。
# 这里三个通道对应的值都为0,即黑色,可以通过图像进行观察
for i in range(100, 150):
for j in range(0, 100):
f[i, j] = 0
# 显示修改之后的图像
cv2.imshow('02', f)
print("修改像素之后,个别像素对应的像素值\n")
print("f[0, 0]=\n", f[0, 0])
print("f[50,0]=\n", f[50, 0])
print("f[100,0]\n", f[100, 0])
cv2.waitKey()
cv2.destroyAllWindows()
对应结果图像如下图所示:
01是原图像,02是修改之后的图像。
打印输出更改像素值前后的结果如下图所示。
(三)numpy.array库在图像处理中的应用
这个库中有两个函数,item(), itemset(),可以用来访问像素和修改像素值,如果不用这两个函数的话,我们也能操作,就像前面的(一)、(二)我们都是直接通过图像对象进行操作的。
对于灰度图像:
item(行,列):item是我们的图像对象,像前面的f,由行和列我们就可以确定一个像素的值。
itemset((行,列),要修改的值):这个比我们前面的操作要方便一点,通过这个语句可以直接对像素进行修改。
对于彩色图像:
item(行,列,通道):item是我们的图像对象,像前面的f,由行和列,和通道我们就可以确定某一个通道的一个像素的值。
itemset((行,列,通道),要修改的值):即先通过(行,列,通道)确定一个像素,然后用要修改的值来改变它。如果省去了通道这个值,则是对三个通道的值都进行了相同值的赋值操作。
(四)查看图像的属性信息
假如f代表一幅图像,则可以通过
f.shape:获得图像的行数、列数、通道数(对于彩色图像而言)。
f.size:获得图像的像素数目,即整幅图像有多少个像素。
f.dtype:可以查看图像f的数据类型。
总结:以上就是对像素的基础操作,请大家动手实践哈。
转载请注明出处。编写不易,给个赞吧。