opencv-python(四):图像的基础操作

本文详细介绍了如何使用OpenCV进行图像像素的获取与设置,包括BGR彩色图和灰度图的处理。同时,讲解了如何通过numpy操作像素,获取图像属性如形状、大小和数据类型,以及进行ROI选择、通道拆分与合并、通道赋值等。此外,还探讨了图像扩充的不同方法,如不同边界的填充效果。
摘要由CSDN通过智能技术生成

1. 像素值的获取:对于一幅图我想要获取某个像素点的值

BGR彩色图:

  • pos=img[x,y] # 输出三个通道的值,比如[210 198 220]
  • pos=img[x,y,0] # 输出(x,y)像素点的0通道值。比如210
标号通道
0B
1G
2R

灰度图:

  • pos=img[x,y] #输出(x,y)像素点的值,比如206
img=cv2.imread("donald_trump.jpg") # 以彩色模式读入
img_gray=cv2.imread("donald_trump.jpg",cv2.IMREAD_GRAYSCALE) # 以灰度图模式读入

res=img[1,1] # 获取彩色图片中坐标(1,1)的像素值
print(res) # output:[210 198 220]  因为彩色图片是BGR数据

res_gray=img[1,1] # 获取灰度图片中坐标(1,1)的像素值   
print(res_gray) # output:206  因为灰度图片只有亮度

2. 修改图片中某像素点的值

  • img[x,y]=[255,255,255] #对于BGR图片,将(x,y)像素点设为白色
  • img[x,y]=255 #对于灰度值图片,将(x,y)像素点设为白色

3. 使用numpy来获取和设置像素值

  • img.item(10,10,2) :获取(10,10)像素点,通道2的像素值
  • img.itemset((10,10,2),100):设置(10,10)像素点通道2的值为100
import cv2
import numpy as np  # 因为使用numpy,所以需要导入

img=cv2.imread("img.jpg")
pos=img.item(10,10,2) # 获取(10,10)像素点,通道2的像素值
img.itemset((10,10,2),100)  # 设置(10,10)像素点通道2的值为100

4. 获取图像属性

图像属性包括行数、列数、通道数、图像数据类型和像素个数等

  • img.shape:获取图像形状,返回(行数,列数,通道数)
  • img.size:返回图像的像素数目
  • img.dtype:返回图像数据类型
# 对于一副BGR的彩色图img
print(img.shape) # output:(800, 600, 3)
print(img.size) # output:1440000
print(img.dtype) # output:uint8

5. 图像ROI(获取区域像素)

ROI:region of interest,即感兴趣区域。比如你研究人脸检测,那么一幅图中的人脸就是你本次研究的感兴趣区域。
现在我要截取人脸部分的像素怎么办?(类似截图)

  • img_face=img[176:618,60:506]:即将行数176-618,列数60-506这样一个区域的像素复制给img_face
img=cv2.imread("donald_trump.jpg")
img_face=img[176:618,60:506]

左:img
右:img_face
在这里插入图片描述

img=cv2.imread("donald_trump.jpg")
img_face=img[176:618,60:506]

img[276:718,60:506]=img_face # 将img_face赋值给原图的276-718,60-506区域

在这里插入图片描述

6. 拆分与合并通道

  • b,g,r=cv2.split(img):将三个通道拆分为三个2维矩阵,分别赋给b,g,r

或者

  • b=img[:,:,0]
  • g=img[:,:,1]
  • r=img[:,:,2]

合并:

  • imgcv.merge(b,g,r):将三个通道合并为一个BGR彩色图

7. 通道赋值

如果你想让图片img的红色通道全部为0,则可以这样:

  • img[:,:,2]=0 # 将R通道整个矩阵都置为0
    当然如果你有一个矩阵mat,像设img的红色矩阵为该矩阵,则可以:
  • img[:,:,2]=mat # 用mat矩阵替代img的红色通道

8. 图像扩充

如果我们想增大图像尺寸,类似给图片加框效果,可以使用填充

  • cv2.copyMakeBorder(src,top,bottom,left,right,borderType[,value])
  • top,bottom,left,right:代表你要在这四个方向上扩展几行(列),比如10,30,60,100表示在上部拓展10行,下方拓展30行,左边拓展60列,游标拓展100列
  • borderType:表示扩展模式
  • value:当扩展模式=BORDER_CONSTANT,value用来指定颜色,比如红色:value=(0,0,255)
扩展模式含义
cv2.BORDER_CONSTANT指定颜色扩充
cv2.BORDER_REPLICATE复制边缘扩充
cv2.BORDER_REFLECT以边界线对称,复制图像扩充,比如“10”–>“1001”
cv2.BORDER_REFLECT_101同上,只不过"10"–>“101”
cv2.BORDER_DEFAULT同cv2.BORDER_REFLECT,效果相同
cv2.BORDER_WRAP不知道怎么描述,自己看效果图
cv2.imshow("img", img)
cv2.imshow("cv2.BORDER_CONSTANT", cv2.copyMakeBorder(img, 10, 30, 60, 100, cv2.BORDER_CONSTANT, value=(0, 0, 256)))
cv2.imshow("cv2.BORDER_REPLICATE", cv2.copyMakeBorder(img, 10, 30, 60, 100, cv2.BORDER_REPLICATE))
cv2.imshow("cv2.BORDER_REFLECT", cv2.copyMakeBorder(img, 10, 30, 60, 100, cv2.BORDER_REFLECT))
cv2.imshow("cv2.BORDER_REFLECT_101", cv2.copyMakeBorder(img, 10, 30, 60, 100, cv2.BORDER_REFLECT_101))
cv2.imshow("cv2.BORDER_DEFAULT", cv2.copyMakeBorder(img, 10, 30, 60, 100, cv2.BORDER_DEFAULT))
cv2.imshow("cv2.BORDER_WRAP", cv2.copyMakeBorder(img, 10, 30, 60, 100, cv2.BORDER_WRAP))  

cv2.waitKey(0)

原图(注意:后面是我的桌面,不是图片内容):
在这里插入图片描述
下列图中,图像标题名即模式:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值