引文:在opencv中,黑白图像实际上就是一个二维数组,彩色图像是一个三维数组。数组中的每个元素就是图像对应元素的像素值。因此修改图像像素的操作实际上就是修改数组操作。
概念讲解:
像素的纵坐标=数组的行索引=像素所在行数-1
像素得横坐标=像素的列索引=像素所在列数-1
1,创建黑白图像:
使用OpenCV库创建了一个大小为200x100的黑色图像,并将其显示在窗口中。
# 导入所需的库
import cv2
import numpy as np
# 设置图像的宽度和高度
width = 200
height = 100
# 创建一个大小为(height, width)的全黑图像,像素值的数据类型为uint8
img = np.zeros((height, width), np.uint8)
# 显示图像
cv2.imshow("img", img)
# 等待用户按下任意键
cv2.waitKey()
# 关闭所有打开的窗口
cv2.destroyAllWindows()
解释:
导入所需的库cv2和NumPy。
设置图像的宽度和高度为200和100。
使用NumPy中的zeros函数创建一个大小为(height, width)的全黑图像,像素值的数据类型为uint8。
使用OpenCV中的imshow函数显示图像,第一个参数是窗口的名称,第二个参数是要显示的图像。
使用OpenCV中的waitKey函数等待用户按下任意键。
使用OpenCV中的destroyAllWindows函数关闭所有打开的窗口。
运行这段代码将会出现一个名称为 "img" 的窗口,其中显示了一个黑色的200x100图像。
2,创建纯白色图像:
在图像处理中,我们常常使用的是多通道图像,例如RGB图像就是一个三通道图像,每个像素包含红色通道、绿色通道和蓝色通道的信息。
而单通道图像则只包含一个通道的信息。例如,灰度图像就是一个单通道图像,每个像素只包含灰度值的信息。
在代码中,使用np.ones函数创建图像时,如果我们将通道数设置为1,那么就是创建了一个单通道图像,每个像素点的值都相同。
import cv2
import numpy as np
# 设置图像的宽度和高度
width = 200
height = 100
# 创建一个大小为(height, width)的全1图像,像素值的数据类型为uint8
img = np.ones((height, width), np.uint8)
#可以用下一行带替img = np.ones((height, width), np.uint8)
#img = np.ones((height, width), np.uint8) * 255
# 将图像显示在窗口中
cv2.imshow("img", img)
# 等待用户按下任意键
cv2.waitKey()
# 关闭所有打开的窗口
cv2.destroyAllWindows()
在图像处理中,像素的取值范围通常是从 0 到 255。
像素值为 0 表示黑色,表示该像素完全没有光,相应位置没有颜色。
像素值为 255 表示白色,表示该像素充满了光,相应位置具有最大的亮度。
这是因为在一个 8 位无符号整数 (unsigned byte) 的像素值范围内,0 最小且黑暗,255 最大且代表最亮。
对于单通道的灰度图像,像素的取值范围是从 0(黑色)到 255(白色)。对于多通道的彩色图像,每个通道的像素值可以取 0 到 255 之间的值来表示不同的颜色强度。例如,对于 RGB 图像,红色通道、绿色通道和蓝色通道的像素值都在 0 到 255 之间,组合在一起可以表示不同的颜色。
在图像处理中,像素的取值范围也可以是从 0 到 1。
像素值为 0 表示黑色,表示该像素完全没有光,相应位置没有颜色。
像素值为 1 表示白色,表示该像素充满了光,相应位置具有最大的亮度。
这种取值范围通常用于浮点数表示的图像,例如使用浮点数(float)或双精度浮点数(double)的灰度图像或彩色图像。
对于浮点图像,像素的值可以是从 0.0 到 1.0 之间的任意值,其中 0.0 表示黑色,1.0 表示白色。通过线性缩放或其他颜色映射方式,这些值可以映射到更广泛的范围内,以显示不同的亮度和颜色。
需要注意的是,对于大部分图像处理函数和算法,都需要将像素值归一化到适当的范围内进行处理。因此,如果像素的取值范围不是 0 到 255,就需要进行归一化或逆归一化操作。
3,在黑色图像内部绘制白色矩形:
import cv2
import numpy as np
width = 200
height = 100
# 创建一个大小为(height, width)的全黑图像,像素值的数据类型为uint8
img = np.zeros((height, width), np.uint8)
# 将图像中纵坐标为25到75,横坐标为50到100之间的区域的像素值设为255,即将该区域变为白色
img[25:75, 50:100] = 255
# 将图像显示在窗口中
cv2.imshow("img", img)
# 等待用户按下任意键
cv2.waitKey()
# 关闭所有打开的窗口
cv2.destroyAllWindows()
创建了一个宽度为200,高度为100的单通道图像,并且使用切片操作将图像中纵坐标为25到75,横坐标为50到100之间的区域的像素值设置为255,即将这个区域变为白色。然后使用OpenCV的imshow函数将图像显示在窗口中,等待用户按下任意键后关闭窗口。
具体来说,img[25:75, 50:100]表示选取图像中行索引从25到74(共50行)和列索引从50到99(共50列)的区域,即图像中纵坐标为25到75,横坐标为50到100之间的矩形区域。
将该区域的像素值赋值为255,即img[25:75, 50:100] = 255,意味着将这个区域的所有像素值都设置为255,从而将该区域变为白色。
该操作可以通过赋值操作符直接修改图像的像素值,而无需遍历每个像素进行修改。
4,创建黑白相间的图像:
import cv2
import numpy as np
width = 200
height = 100
# 创建一个大小为(height, width)的全黑图像,像素值的数据类型为uint8
img = np.zeros((height, width), np.uint8)
# 在图像中创建一组垂直的白色条纹
for i in range(0, width, 40):
# 将图像的所有行的该宽度范围的像素值设置为255,即将该区域变为白色
img[:, i:i + 20] = 255
# 将图像显示在窗口中
cv2.imshow("img", img)
# 等待用户按下任意键
cv2.waitKey()
# 关闭所有打开的窗口
cv2.destroyAllWindows()
代码中的range(0, width, 40)表示使用步长为40生成一个从0到width(不包含width)的整数序列。
range(0, width, 40)的作用是生成一个从0开始,以40为步长的整数序列。
具体而言,如果width的值为200,那么range(0, width, 40)将生成以下整数序列:0, 40, 80, 120, 160。
这意味着在循环中,i的值将分别为0, 40, 80, 120, 160。这样循环体内的代码将在这些i的值上被执行。
代码img[:, i:i + 20]的作用是将图像中的某个宽度范围内的所有像素值都设置为255,即将这个区域变为白色。
具体来说,img[:, i:i + 20]表示选取图像中所有行和列索引从i到i+20(不包含i+20)的区域。
将该区域的像素值赋值为255,即img[:, i:i + 20] = 255,意味着将这个区域中的所有像素值都设置为255,从而将该区域变为白色。
这里的:表示选取所有行,i:i + 20表示选取列索引从i到i+20的范围内的列。
通过这个赋值操作符,可以直接修改图像的像素值而不需要遍历每个像素进行修改。
5,创建彩色图像:
import cv2
import numpy as np
width = 200
height = 100
# 创建一个大小为(height, width, 3)的全黑图像,像素值的数据类型为uint8
img = np.zeros((height, width, 3), np.uint8)
# 创建一个蓝色图像副本,即BGR通道分别为(255, 0, 0)
blue = img.copy()
blue[:, :, 0] = 255
# 创建一个绿色图像副本,即BGR通道分别为(0, 255, 0)
green = img.copy()
green[:, :, 1] = 255
# 创建一个红色图像副本,即BGR通道分别为(0, 0, 255)
red = img.copy()
red[:, :, 2] = 255
# 分别将蓝色、绿色、红色图像显示在窗口中
cv2.imshow("blue", blue)
cv2.imshow("green", green)
cv2.imshow("red", red)
# 等待用户按下任意键
cv2.waitKey()
# 关闭所有打开的窗口
cv2.destroyAllWindows()
代码img = np.zeros((height, width, 3), np.uint8)创建了一个大小为(height, width, 3)的三通道图像,初始化像素值为0,并使用数据类型为np.uint8。
具体来说,np.zeros函数创建了一个由0组成的数组,参数(height, width, 3)指定了数组的形状。其中height代表图像的高度,width代表图像的宽度,而3表示图像有三个通道:蓝色、绿色和红色(BGR)。
np.uint8是一个无符号8位整数的数据类型。在OpenCV中,图像像素值的数据类型通常为np.uint8,该数据类型取值范围是从0到255。
这行代码img = np.zeros((height, width, 3), np.uint8)的作用是创建一个大小为height x width的彩色图像,所有像素的初始值为0(全黑),并且有三个通道来表示蓝色、绿色和红色分量。
代码blue[:, :, 0] = 255的作用是将图像的蓝色通道的所有像素值设置为255,将整个图像变为全蓝色。
具体来说,blue[:, :, 0]表示选取图像的所有行和列,然后选取蓝色通道(通道索引为0)。
将该通道的所有像素值赋值为255,即blue[:, :, 0] = 255,意味着将图像的蓝色通道中的所有像素值都设为255,从而将整个图像变为全蓝色。
在这里使用了切片操作符:,表示选取图像的所有行和列。
通过这个赋值操作符,可以直接修改图像的像素值而不需要遍历每个像素进行修改。