【OpenCV】04.图片基本操作

Posted on Sep 12, 2022

在本教程中,我们将会学习最基本的图片操作。我们将会从以下几个方面进行学习:

  • 查看和修改像素数值。
  • 查看图片属性。
  • 设置图片范围。
  • 分割拼接图片。
  • 改名色彩空间。

查看和修改像素数值

我们可以通过坐标获取像素数值。它将返回一个包含 BGR 信息的数组。以及一个灰阶图像。首先我们需要加载 BGR 图像。

import numpy as np  
import cv2  
img = cv2.imread("C:\Users\DEVANSH SHARMA\cat.jpeg",1)  
pixel = img[100,100]  
print(pixel)   

输出:

[190 166 250]

查看图片属性

在处理图片之前最好是先获取图片的大小。在 OpenCV 中,图像通常储存在 Numpy ndarray。要获取图片的大小或形状,使用 ndarray.shape 获取图片的尺寸。我们可以通过索引获取图片的高度、宽度以及通道数。

下面是一个例子:

import cv2  
# read image  
img = cv2.imread(r'C:\Users\DEVANSH SHARMA\cat.jpeg',1)  
  
# height, width, number of channels in image  
height = img.shape[0]  
width = img.shape[1]  
channels = img.shape[2]  
size1 = img.size  
  
print('Image Dimension    : ',dimensions)  
print('Image Height       : ',height)  
print('Image Width        : ',width)  
print('Number of Channels : ',channels)  
print('Image Size  :', size1)  

输出:

Image Dimension    :  (4, 1, 3)
Image Height       :  4
Image Width        :  1
Number of Channels :  3
Image Size  : 12

图像 ROI (Region of Interest)

有时我们只需要图片的部分区域。之前的教程中提到过,面部识别基于整张图片。当识别到面部信息时,我们只需要面部所在区域,继续搜索眼睛等信息,而不是搜索整张图片,因为眼睛总是在面部。这能够提升准确度,也能提高程序的性能表现。

opencv-basic-operation-on-images

分割拼接图片

如果需要,可以拆分图片的 BGR 通道。独立的 BGR 通道也能够重新合并到 BGR 图片中,方法如下:

b,g,r = cv2.split(img)  
img = cv2.merge((b,g,r))  

或者

b = img[:,:,0]  

增加图片边框

OpenCV 提供 cv2.copyMakeBorder() 函数为图片增加边框。语法如下:

cv2.copyMakeBorder(src,top,bottom,left,right,border type)  

参数:

src 图片输入。

top,bottom,left,right 图片四条边框的像素大小。

borderType 边框类型。

value 边框颜色,需要边框类型为 cv.BORDER_CONSTANT

import cv2 as cv  
import numpy as np  
from matplotlib import pyplot as plt  
BLUE = [255,0,0]  
img1 = cv.imread(r'C:\User\DEVANSH SHARMA\flower.jpg',1)  
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,'gray'),plt.title('ORIGINAL')  
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')  
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')  
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')  
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')  
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')  
plt.show()   

改变色彩空间

cvtColor 用来改变色彩空间。语法如下:

cv2.cvtColor(src, dst, code)  

参数

src 输入一张 8 比特图片。

dst 图片输出。

code 色彩空间代码。

# importing cv2    
import cv2    
     
# path of the input image  
path = (r'C:\Users\DEVANSH SHARMA\cat.jpeg')  
     
# Reading an image in default mode   
src = cv2.imread(path)   
     
# Window name in which image is displayed   
window_name = 'Image'   
# Using cv2.cvtColor() method   
# Using cv2.COLOR_BGR2GRAY color space for convert BGR image to grayscale  
# conversion code   
image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY )   
# Displaying the image    
cv2.imshow(window_name, image)  

输出: opencv-reading-images