OpenCV 创建图像
图像处理中的一项任务是创建图像,可以从头开始创建图像,也可以加载现有图像并对其进行修改。本教程将讨论在 OpenCV 中创建图像的常见方法。
使用 OpenCV 中的NumPy
库的zeros()
函数创建图像
图像由放置在矩阵中的像素组成。每个像素包含一个颜色值,即 BGR 三元组。
BGR 三元组值包含三个范围为0 到 255
之间的值,在一个 8 位图像中。第一个值对应蓝色的强度,第二和第三个 BRG 三元组值对应绿色和红色。
我们可以设置这三种颜色的值来制作任何颜色。
在 8 位图像中,一个像素可以有256
乘以256
乘以255
种不同的颜色。我们可以使用NumPy
的zeros()
函数创建一个黑色的图像。
zeros()
函数创建一个给定行数和列数的矩阵,矩阵中只包含零。
示例代码 1:
import cv2
import numpy as np
# Define the dimensions of the image
height = 512
width = 512
# Create a black image with the specified dimensions
img = np.zeros((height, width, 3), np.uint8)
# Display the image
cv2.imshow("Binary", img)
# Wait until a key is pressed and then close the image window
cv2.waitKey(0)
输出:
上面的图像中每个像素的 BGR 三元组值都为(0,0,0)
,即黑色。我们也可以通过将每个像素值设置为 BGR 三元组值来改变图像的颜色。
现在,让我们将上述图像的颜色更改为蓝色。
示例代码 2:
import cv2
import numpy as np
# Define the dimensions of the image
height = 512
width = 512
# Create a black image with the specified dimensions
img = np.zeros((height, width, 3), np.uint8)
# Fill the entire image with a blue color
img[:, :] = (255, 0, 0)
# Display the image
cv2.imshow("image", img)
# Wait until a key is pressed and then close the image window
cv2.waitKey(0)
输出:
上面的代码中的冒号(:)
符号用于表示所有的行和列。第一个冒号对应列,第二个冒号对应img
矩阵的行。
冒号还可以定义范围,例如0 到 100
可以表示为0:100
。我们可以在图像中设置某些像素的颜色,而不是设置所有像素的颜色。
例如,让我们为上述图像的不同部分设置不同的颜色。
示例代码 3:
import cv2
import numpy as np
# Define the dimensions of the image
height = 512
width = 512
# Create a black image with the specified dimensions
img = np.zeros((height, width, 3), np.uint8)
# Fill the entire image with blue color (BGR format)
img[:, :] = (255, 0, 0)
# Fill a region in the top-left corner with yellow color
img[0:100, 0:100] = (255, 255, 0)
# Fill the right half of the image with red color
img[:, width // 2 : width] = (0, 0, 255)
# Display the resulting image
cv2.imshow("image", img)
# Wait for a key press and close the image window
cv2.waitKey(0)
输出:
在上述代码中,我们将第一个100
列和第一个100
行的颜色设置为青色,将图像的右侧颜色使用图像的宽度设置为红色。
使用 OpenCV 的绘图函数创建图像
OpenCV 提供了一系列绘图函数,允许您向图像中添加图形元素。使用以下函数,您可以创建具有形状、线条和文本的图像。
-
-
cv2.line()
:在两个点之间绘制直线。 -
-
cv2.rectangle()
:绘制一个具有指定尺寸的矩形。 -
-
cv2.circle()
:绘制一个具有给定中心和半径的圆。 -
-
cv2.ellipse()
:绘制一个具有指定参数的椭圆。 -
-
cv2.polylines()
:绘制一个多边形或一系列连接的线段。 -
-
cv2.putText()
:向图像添加文本。
示例代码:
import cv2
import numpy as np
# Create a blank image with a white background
width, height = 640, 480
blank_image = np.zeros((height, width, 3), dtype=np.uint8)
blank_image[:] = (255, 255, 255) # White color in BGR format
# Draw a red rectangle
start_point_rect = (100, 100)
end_point_rect = (300, 300)
red_color = (0, 0, 255) # Red color in BGR format
thickness_rect = 2
cv2.rectangle(blank_image, start_point_rect, end_point_rect, red_color, thickness_rect)
# Draw a green circle
center_circle = (400, 150)
radius_circle = 50
green_color = (0, 255, 0) # Green color in BGR format
thickness_circle = -1 # Negative thickness fills the circle
cv2.circle(blank_image, center_circle, radius_circle, green_color, thickness_circle)
# Draw a blue line
start_point_line = (50, 400)
end_point_line = (600, 400)
blue_color = (255, 0, 0) # Blue color in BGR format
thickness_line = 5
cv2.line(blank_image, start_point_line, end_point_line, blue_color, thickness_line)
# Add text to the image
text = "OpenCV Drawing"
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
font_color = (0, 0, 0) # Black color in BGR format
font_thickness = 2
text_position = (50, 50)
cv2.putText(
blank_image, text, text_position, font, font_scale, font_color, font_thickness
)
# Display the image
cv2.imshow("Image with Drawing", blank_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出: