欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Opencv 图像操作基础

程序员文章站 2024-01-27 17:05:58
...

本文翻译自:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#basic-operations-on-images

目录

图像的获取与调整

获取图像的属性

获取图像的ROI(关注区)

图像填充边框


本节主要学习:

  1. 获取图像、获取图像某一个像素的取值、并调整它
  2. 获取图像的属性,比如尺寸等
  3. 设置ROI(关注区)
  4. 图像的拆分与重整

本节主要用到 Numpy 而非 Opencv

图像的获取与调整

读取图像:

path = r'.\test1.jpg'    #设置路径
import cv2
import numpy as np
img = cv2.imread(path)

我们可以根据像素的行、列索引获取特定的像素,对于BGR图像(Opencv默认将彩色图像按蓝、绿、红读取),它将返回蓝、绿、红三个通道构成的数列。对于灰度图像,将返回该位置对应的像素密度值。

px = img[100,100]
print(px)

#获取蓝色通道的像素值
blue = img[100,100,0]
print(px)
[ 71  92 173]
[ 71  92 173]

我们可以用同样的方法调整像素值

img[100,100] = [255,255,255]
print(img[100,100])
[255 255 255]

提示

由于Numpy模块是为了数列运算开发的,因此单单用来根据索引找寻一个像素点、调整某像素的值不太妥当,因此上述方法实际上并不高效,运行很慢。所以,以上操作只用在获取多个像素点、修改多个像素点的场合。

对于单一像素点的获取与修改,可使用:

img.item(100,100,0)
img.itemset((100,100,0),255)

获取图像的属性

img.shape
Out[8]: (371, 660, 3)

img.size
Out[9]: 734580

img.dtype
Out[10]: dtype('uint8')

 其中,shape返回图像的行(高度)、列(宽度)和通道数(彩色图像一般为3通道)

size返回图像的所有像素点的个数

dtype返回图像的类型,一般为uint8。该方法一般用在 debug 的时候,一般图像出错都是因为数据类型的原因。

获取图像的ROI(关注区)

我们可以通过索引直接获取,比如

ROI = img[100:200,100:200]

图像填充边框

If you want to create a border around the image, something like a photo frame, you can use cv2.copyMakeBorder() function. But it has more applications for convolution operation, zero padding etc. This function takes following arguments:

如果你想要在图像周围,创建一个照片边框,那么你可以使用 cv2.copyMakeBorder()函数。一般会在卷积时,给图像填充一个0像边框。cv2.conpyMakeBorder()函数接收一下参数:

src —— 源图像

top、bottom、left、right —— 边框的包含的像素点

borderType —— 定义使用何种填充形式:

  • cv2.BORDER_CONSTANT—— 像素为固定值,若是用该值作为参数,则必须紧跟着另一个参数,用以设置像素大小
  • 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

value - 当borderType 选择 cv2.BORDER_CONSTANT 需要用到该参数,用以设置填充像素

实例代码

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

BLUE = [255,0,0]

img1 = cv2.imread('opencv_logo.png')

replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.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()

Opencv 图像操作基础