Basic Operations on Images-图像基本操作-python

本文介绍了如何使用Python的OpenCV库进行图像操作,包括访问和修改像素值、获取图像属性、选择感兴趣区域(ROI)、拆分和合并图像通道,以及为图像添加不同类型的边框。
摘要由CSDN通过智能技术生成

一、访问和修改像素值

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_CONSTANTcv2.BORDER_REFLECTcv2.BORDER_REFLECT_101cv2.BORDER_WRAPcv2.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:(仅当borderTypecv2.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()

输出

 

 ## 学习笔记,欢迎各位大佬指错! 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值