一、访问和修改像素值
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(r'F:\Python\2024_last\image\multimodal_image_283822130U794804.jpg')
assert img is not None, "file could not be read, check with os.path.exists()"
print(img[300, 300]) # 访问单个像素的BGR通道
print(img[300, 300, 0]) # 访问单个像素的B通道
输出
[196 209 236]
196
修改像素值不再赘述
二、访问图像属性
print('img.shape:', img.shape)
print('img.size:', img.size)
print('img.dtype:', img.dtype)
输出
img.shape: (609, 718, 3)
img.size: 1311786
img.dtype: uint8
三、图像ROI
看了官方文档,应该是提取图片中关注的区域,去除不重要的像素
img1 = img[300:360, 330:400]
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title('原图')
axes[1].imshow(img1[:, :, ::-1])
输出
四、拆分和合并图像通道
b, g, r = cv.split(img) # 拆分
img = cv.merge((b, g, r)) # 合并
五、为图像制作边框(填充)
cv.copyMakeBorder(src, top, bottom, left, right, borderType, dst, value)
src:原图像,即需要添加边框的图像。
dst:目标图像,即添加边框后的输出图像。
top:在原图像上方添加的边框宽度(以像素为单位)。
bottom:在原图像下方添加的边框宽度(以像素为单位)。
left:在原图像左侧添加的边框宽度(以像素为单位)。
right:在原图像右侧添加的边框宽度(以像素为单位)。
borderType:(可选)边框的类型,可以是常数值如cv2.BORDER_CONSTANT
、cv2.BORDER_REFLECT
、cv2.BORDER_REFLECT_101
、cv2.BORDER_WRAP
或cv2.BORDER_REFLECT
。默认为cv2.BORDER_CONSTANT
。
- cv2.BORDER_CONSTANT: 添加的边界框像素值为常数。这意味着你可以指定一个固定的颜色值来填充边框。这种类型通常用于想要在图像周围添加一个固定颜色边框的情况。
- cv2.BORDER_REFLECT: 添加的边框像素将是边界元素的镜面反射。这会使得边框区域的像素值是原图像边缘像素值的镜像反射,适用于需要保持图像边缘特征的情况。
- cv2.BORDER_REFLECT_101: 这是一种特殊类型的
BORDER_REFLECT
,它使用了一种优化的反射方法,可以减少计算量,提高性能。 - cv2.BORDER_WRAP: 边框的像素值将是相邻边缘像素的值,如果超出图像范围,则会从另一侧继续取值,类似于周期性的边界条件。
- cv2.BORDER_REFLECT: 这是
BORDER_REFLECT
的别名,两者功能相同。
value:(仅当borderType
为cv2.BORDER_CONSTANT
时可选)用于填充边框的颜色值。
下面是示例代码
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255, 0, 0]
img1 = cv.imread(r'p.jpg')
assert img1 is not None, "file could not be read, check with os.path.exists()"
replicate = cv.copyMakeBorder(img1, 10, 10, 10, 10, cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img1, 10, 10, 10, 10, cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img1, 10, 10, 10, 10, cv.BORDER_REFLECT_101)
wrap = cv.copyMakeBorder(img1, 10, 10, 10, 10, cv.BORDER_WRAP)
constant= cv.copyMakeBorder(img1, 10, 10, 10, 10, cv.BORDER_CONSTANT, value=BLUE)
plt.subplot(231),plt.imshow(img1[:, :, ::-1]),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate[:, :, ::-1]),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect[:, :, ::-1]),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101[:, :, ::-1]),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap[:, :, ::-1]),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant[:, :, ::-1]),plt.title('CONSTANT')
plt.show()
输出
## 学习笔记,欢迎各位大佬指错!