1. 像素值的获取:对于一幅图我想要获取某个像素点的值
BGR彩色图:
- pos=img[x,y] # 输出三个通道的值,比如[210 198 220]
- pos=img[x,y,0] # 输出(x,y)像素点的0通道值。比如210
标号 | 通道 |
---|---|
0 | B |
1 | G |
2 | R |
灰度图:
- 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)
原图(注意:后面是我的桌面,不是图片内容):
下列图中,图像标题名即模式: