OpenCV学习笔记6-图像的基础操作

  1. 获取像素值并修改
  2. 获取图像的信息参数
  3. 图像的ROI()
  4. 图像通道的拆分及合并
  5. 给图像添加边界(padding)

img[行,列,通道] #通道:b(0),g(1),r(2)

1.获取像素值并修改


import numpy as np
import cv2

img = cv2.imread('../../photo/1.jpg', 1)  #读取彩色图像
print(img[100,50,:])                      #打印(100,50)处的像素值

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', img[:,:,1])           #显示图像G通道的图像

img[100:300, 200:400, :] = 255            #将图像中某个区域变成白色
cv2.namedWindow('image2', cv2.WINDOW_NORMAL) 
cv2.imshow('image2', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

2.获取图像的信息参数

图像的信息参数(行/列/通道数/图像数据类型/像素数目等)


import numpy as np
import cv2

img = cv2.imread('1.png', 1)
print(img.shape)   #获取图像尺寸(行数,列数,通道数)(185,229,3)
print(img.size)    #获取图像大小(像素数)(127095)
print(img.dtype)   #获取各像素的数据类型(uint8)

3.图像区域(ROI)

有时我们关注的是图像中的某一个区域中的目标,例如在做人脸识别时,首先要做的就是要找到人脸区域,显然,图像区域ROI就是一个很重要的概念。


import numpy as np
import cv2

img = cv2.imread('1.png', 1)

wuding = img[65:133, 65:126, :]  #截取屋顶区域
img[65:133, 140:201, :] = wuding #将屋顶区域拷贝到图像其他区域

cv2.imshow('wuding', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.图像通道的拆分及合并


import numpy as np
import cv2

img = cv2.imread('i.png', 1)

b, g, r = cv2.split(img) #拆分(一般不用,因为numpy的矩阵切片与合并操作更高效)
img = cv2.merge(b, g, r) #合并

#拆分方法2:利用numpy的矩阵切片
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
img[:,:,2] = 0  #使所有像素的r通道值为0

5.给图像添加边界(padding)

cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]]) -> dst

  • src是输入的图像矩阵;
  • top, bottom, left, right分别是各个方向的边界宽度;
  • borderType指边界的类型,有以下的多种选择:
    ** cv2.BORDER_CONSTANT - 颜色边界,RGB值在后一个参数给出
    ** cv2.BORDER_REFLECT - 镜像边界:fedcba|abcdefgh|hgfedcb
    ** cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT - 另一种进行边界:gfedcb|abcdefgh|gfedcba
    ** cv2.BORDER_REPLICATE - 边界最外面的颜色将被重复: aaaaaa|abcdefgh|hhhhhhh
    ** cv2.BORDER_WRAP - 平铺效果 : cdefgh|abcdefgh|abcdefg

from matplotlib import pyplot as plt
import numpy as np
import cv2

BLUE = [255, 0, 0]
img = cv2.imread('opencv_logo.jpg', 1)

#添加不同类型的边界
replicate = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_CONSTANT, value = BLUE)

#使用matplotlib绘制,交换R和B的位置,OpenCV中是按BGR,matplotlib中是按RGB排列
#或者转换一下:img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
#plt.xticks([]), plt.yticks([]) 隐藏坐标
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('Replicate'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('Reflect'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('Reflect101'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('Wrap'), plt.xticks([]), plt.yticks([])
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('Constant'), plt.xticks([]), plt.yticks([])

plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值