opencv-python学习笔记(二)

文章目录

  • 图像基本操作
    • 为图像设置边框
  • 图像上的算术运算
    • 覆盖
    • 图像融合
    • 位运算
  • 性能测试与提高
    • 衡量性能
    • Opencv的默认优化功能

图像基本操作

. 当读取完一个图像之后,可以直接通过横纵坐标来返回该像素点的rgb值:

img = cv2.imread('kkxj.jpg')
px = img[100,100]
print(px)
#还可以通过第三个值选择只打印某个通道的值
blue = img[100,100,0]
print(blue)
#还可以直接更改像素点的值
img[100,100] = [0,0,0]
print(img[100,100])
#以上方法可以通过函数item()和itemset()实现,但是都只能获取或设置单通道的值
print(img.item(100,100,1))
img.itemset((100,100,2),100)
#显示图片信息(行,列,通道数(如果是彩色的话))
print(img.shape)
#打印像素点个数
print(img.size)
#打印图像数据类型
print(img.dtype)
#选取部分图像,前者时纵向长度,后者时横向长度
ball = img[100:150,200:230]
#区域赋值
img[100:110,100:150] = ball
#图像的bgr通道可以分开获得
b,g,r = cv2.split(img)     
b = img[:,:,0]			#推荐
#也能合并起来组成图像
img = cv2.merge((b,g,r))

为图像设置边框

. 可以使用cv2.copyMakeBorder() 来为图像添加边框,这个函数还在卷积运算,零填充等方面有更多应用。函数包含7个参数第一个是输入的图像,接着的四个分别是上下左右四个边框的像素宽度,第六个参数是边框类型标志,它的值决定最后一个参数是否需要给出,其值如下:

类型 描述
cv2.BORDER_CONSTANT 添加恒定的彩色边框,需要指定最后一个参数(边框颜色)
cv2.BORDER_REFLECT 边框将边框元素进行镜面反射,比如fedcba|abcdefgh|hgfedcb,中间被两边做镜像反射
cv2.BORDER_REFLECT_101 (cv2.BORDER_DEFAULT) 与上诉类似,不过会抛弃末尾的值,比如fedcb|abcdefgh|gfedcb
cv2.BORDER_REPLICATE 末尾的值被复制,比如aaaaaa|abcdefgh|hhhhhh
cv2.BORDER_WRAP 无法解释(???)
img = cv2.imread('kkxj.jpg')
#加蓝色框
constant = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_CONSTANT,value = [255,255,0])
cv2.imshow('f',constant)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像上的算术运算

覆盖

. 图像的加法可以使用opencv带的函数cv2.add() 或是使用numpy操作,两张图片应该具有相同的深度和类型,或是其中一张都是标量值。不过add方法和unmpy操作的结果会有所不同:

x = np.uint8([250])
y = np.uint8([10])

print cv2.add(x,y)     		# 250+10 = 260 => 255
print x+y                  	# 250+10 = 260 % 256 = 4

. 前者得出的值是[[255]],后者得到的是取模运算后的值[4]。

图像融合

. 这也是图像的加法,不过是带权的,这样就给人一种融合的感觉,使用cv2.addWeighted() 给两张图像分配权重(0-1):

img1 = cv2.imread('img1.png')
img2 = cv2.imread('img2.jpg')

dst = cv2.addWeighted(img1,0.7,img2,0.3,0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()  

位运算

. 位运算在做提取图像的某些区域的操作的时候会很有用,如果直接使用add,会改变图象的色彩,如果使用融合,会让图像变得有透明感,并且提取的区域可以不受形状限制。

img1 = cv2.imread('kkxj.jpg')
img2 = cv2.imread('fire.png')

#将img2放在左上角
row,col,channel = img2.shape
roi = img1[0:row,0:col]

img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) #灰度化
#二值化,第二个参数是阈值,cv2.THRESH_BINARY表示原图像像素点的值大于阈值就置为第三个参数的值
ret,mask = cv2.threshold(img2gray,10,255,cv2.THRESH_BINARY)
#像素点按位取反
mask_inv = cv2.bitwise_not(mask)

#第一个参数和第二个参数相同,就相当于和第三个参数的图片做按位与操作,
#这里相当于抠了个黑色凹槽
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
#相当于抠出来的插件
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)

#将插件插入插槽
dst = cv2.add(img1_bg,img2_fg)
#覆盖原图像的部分区域
img1[0:row,0:col] = dst

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

性能测试与提高

衡量性能

. cv2.getTickCount函数返回指定的事件(比如开机)后到调用该函数经过的时间周期数,因此可以通过在某个函数开始前和结束后调用getTickCount函数获得这个函数的执行时间。
. cv2.getTickFrequency函数返回时钟周期的频率,因此可以通过以下方式获得函数执行时间:

e1 = cv2.getTickCount()
...
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()

Opencv的默认优化功能

. 很多opencv函数都使用SSE2、AVX等指令集来实现优化,所以当系统支持这些功能的时候,应该加以使用,当然,opencv也是包含没有使用优化的代码的,因此,如果opencv启用优化功能,将在运行的时候使用优化代码,否则使用未优化代码。
. 可以使用cv2.useOptimized() 函数来检查是否启用了优化功能,使用cv2.setUseOptimized() 函数来手动启用或是禁用优化功能。使用与不使用通常会有明显的性能区别。

你可能感兴趣的:(Python)