您的位置:首页 > 运维架构

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

2017-08-09 11:15 597 查看
获取像素值并修改

获取图像的信息参数

图像的ROI()

图像通道的拆分及合并

给图像添加边界(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
4000
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: