图像的基础操作

1、先读取一个图片

import cv2

import numpy as np

img = cv2.imread('test.jpg')

我们可以获取该图像的属性:行,列,通道,图像数据类型,像素数目等,具体如下。

img.shape:获取图像的形状,返回值是一个包含行数,列数,通道数的元组

img.size:图像的像素数目,长乘以宽乘以通道数。

img.dtype:图像的数据类型

 

img[xp, yp] = [B, G. R],应该是这种形式了,想要更改该像素值,

直接给该坐标上面赋值BGR通道的值即可,当然,也可以分开赋值。如下:

img[xp, yp, 0] = B

img[xp, yp, 1] = G

img[xp, yp, 2] = R

 

其他方法:

对于OpenCV的图像数据结构,我们通常使用 array.item() 来获取某一范围的像素内容并使用array.itemset()设置该像素的信息,比较列表嵌套并使用for循环遍历,是非常高效的。而且,程序的可读性会更好。我们来看下面的例子。

import cv2import numpy as np

img=cv2.imread('test.jpg')

# 打印像素点(10,10)的R通道值

print(img.item(10,10,2))

# 设置像素点(10,10)的R通道为110

img.itemset((10,10,2),110)

# 打印像素点(10,10)的R通道值

print(img.item(10,10,2))

2、图像ROI

 图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,

因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI。

使用numpy索引来获得

import cv2
import numpy as np
img=cv2.imread('xxx.jpg')
ball=img[280:340,330:390]
img[273:333,100:160]=ball

3、拆分及合并图像通道

分别对BGR三个通道操作,有时候需要把独立通道的图片合成一个BGR图像。

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg') b,g,r=cv2.split(img)
img=cv2.merge(b,g,r)
或者
import
cv2 import numpy as np img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg') b=img[:,:,0]
假如你想使所有像素的红色通道值都为 0,你不必先拆分再赋值。你可以
直接使用 Numpy 索引,这会更快。
import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
img[:,:,2]=0
警告:cv2.split() 是一个比较耗时的操作。只有真正需要时才用它,能用
Numpy 索引就尽量用。
4、为图像扩边(填充)
如果你想在图像周围创建一个边,就像相框一样,你可以使用 cv2.copyMakeBorder()
函数。这经常在卷积运算或 0 填充时被用到。这个函数包括如下参数:
• src 输入图像
• top, bottom, left, right 对应边界的像素数目。
• borderType 要添加那种类型的边界,类型如下
– cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要
下一个参数(value)。
– cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcde
fgh|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 边界颜色,如果边界的类型是 cv2.BORDER_CONSTANT
 

 

posted @ 2020-02-06 22:39  Tomorrow1126  阅读(198)  评论(0编辑  收藏  举报