OpenCV篇1---图像的基本操作

学习的目标:

1、访问像素值并修改它们;

2、访问图像属性;

3、设置图像区域(ROI);

4、分割和合并图像;

5、为图像制作边框(填充)。

本节中几乎所有的操作都与Numpy相关,而不是OpenCV。 需要熟悉Numpy才能使用OpenCV编写更好的优化代码。

操作过程中使用的图像:

1、访问像素值并修改它们;

实现代码:

#coding:utf8
import cv2
import numpy as np

img = cv2.imread('F:/picture.jpg')
#访问图像的像素值
px = img[100, 100]
print ("img(100, 100)的像素值:", px)  #返回的值分别代表:蓝色、绿色、红色
#返回单一颜色值,如蓝色、绿色、红色
blue = img[100, 100, 0]
print ("img(100, 100)的蓝色对应的像素值:", blue)
green = img[100, 100, 1]
print ("img(100, 100)的绿色对应的像素值:", green)
rad = img[100, 100, 2]
print ("img(100, 100)的红色对应的像素值:", rad)
#修改图像的像素值
img[100, 100] = [255, 255, 255]
print ("img(100, 100)的修改之后对应的像素值:", img[100, 100])

输出:

img(100, 100)的像素值: [57 63 68]
img(100, 100)的蓝色对应的像素值: 57
img(100, 100)的绿色对应的像素值: 63
img(100, 100)的红色对应的像素值: 68
img(100, 100)的修改之后对应的像素值: [255 255 255]

Numpy是用于快速数组计算的优化库。 因此,简单地访问每个像素值并修改它将会非常缓慢并且不鼓励。

上面提到的方法通常用于选择数组的区域,比如说前5行和后3列。 对于单个像素访问,Numpy数组方法array.item()和array.itemset()被认为更好。 但它总是返回一个标量。 所以如果你想访问所有的B,G,R值,你需要分别调用array.item()。

实现代码:

#coding:utf8
import cv2
import numpy as np

img = cv2.imread('F:/picture.jpg')
#返回单一颜色值,如蓝色、绿色、红色
blue = img.item(100, 100, 0)
print ("blue:", blue)
green = img.item(100, 100, 1)
print ("green:", green)
red = img.item(100, 100, 2)
print ("red:", red)
#修改图像的像素值
px = img.itemset((100, 100, 2), 100)
print ("修改之后的像素值:", px)

输出:

blue: 57
green: 63
red: 68
修改之后的像素值: None

2、访问图像属性

实现代码:

#coding:utf8
import cv2
import numpy as np

img = cv2.imread('F:/picture.jpg')
print ("访问图像属性", img.shape)
print ("像素的总数", img.size)
print ("图像色数据类型", img.dtype)

输出:

访问图像属性 (280, 450, 3)
像素的总数 378000
图像色数据类型 uint8

注意:

①、如果图像是灰度,img.shape返回的元组只包含行数和列数。 所以这是一个很好的方法来检查加载的图像是灰度还是彩色图像。

②、img.dtype在调试过程中是非常重要的,因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的。

3、图像的目标区域:ROI

ROI可以使用Numpy索引获得

#coding:utf8
import cv2
import numpy as np

img = cv2.imread('F:/picture.jpg')
ball = img[280:340, 330:390]
img[273:333, 100:160] = ball

4、分割和合并图像通道

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

5、为图像制作边框(填充)

cv2.copyMakeBorder()函数,输入参数:

src:输入图像;

topbottomleftright: 在相应方向上的像素数量中的边界宽度

borderType -标志定义要添加的边界类型。 它可以是以下类型:

①、cv2.BORDER_CONSTANT - 添加一个常量彩色边框。 值应该作为下一个参数给出。

②、cv2.BORDER_REFLECT - 边框将镜像反射边框元素,如下所示:fedcba | abcdefgh | hgfedcb

③、cv2.BORDER_REFLECT_101 或 cv2.BORDER_DEFAULT 和上面一样,但稍作改动,如下所示:gfedcb | abcdefgh | gfedcba

④、cv2.BORDER_REPLICATE - 最后一个元素在整个过程中被复制,如下所示:aaaaaa | abcdefgh | hhhhhhh

⑤、cv2.BORDER_WRAP - 无法解释,它将如下所示:cdefgh | abcdefgh | abcdefg

#coding:utf8
import cv2
import numpy as np
from matplotlib import pyplot as plt

BLUE = [255,0,0]

img1 = cv2.imread('F:/picture.jpg')

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()

输出:


猜你喜欢

转载自blog.csdn.net/songchunxiao1991/article/details/80222223