Python调用OpenCV进行操作的时候基本上感觉就是对numpy进行操作,跟numpy是挺相关的。
1、像素操作
OpenCV获取图像(x,y)处的像素值:
px=img[x,y]
当图像是三通道的时候返回的是BGR三通道的值,如果是灰度图的话就返回一个亮度值
同样的如果要对图像(x,y)处赋值的话,也通过这种方式来实现:
#三通道
img[x,y]=[255,255,255]
#单通道
img[x,y]=255
2、获取图像属性
获取图像的形式,这个跟numpy的操作基本一样,通过shape来获取:
img.shape
会返回一个图像的形态,也就是(行,列,通道),OpenCV的图像还有一个size属性,这个返回的是总的像素数量行*列*通道数。
通过图像的dtype来获取图像的像素数据类型:
img.dtype
返回的值类型如uint8等
3、图像ROI
OpenCV获取图像的ROI的时候可以使用类似numpy的方式来获取,如:
roi=img[r0:r1,c0:c1]
4、通道分离和合并
通道分离使用的是函数split:
b,g,r=cv2.split(img)
通道分离用的是merge函数:
img=cv2.merge(b,g,r)
当可以不用split的时候就不要用,改用numpy的索引操作,因为split是比较耗时的操作。
5、图像扩充边界
扩充边界的时候就用函数copyMakeBorder(),这个函数有四个参数:
-
src:输入图像
-
top,bottom,left,right:对应的边界的像素数目
-
borderType要添加哪种类型的边界
-
cv2.BORDER_CONSTANT,添加有颜色的常数值边界,也就是下一个参数value;
-
cv2.BORDER_REFLECT,边界颜色的镜像,fedcba|abcdefgh|hgfedcb;
-
cv2.BORDER_REFLECT_101或者cv2.BORDER_DEFAULT,gfedcb|abcdefgh|gfedcba;
-
cv2.BORDER_REPLICATE,重复最后一个像素来填充;
-
cv2.BORDER_WRAP,这个比较...,应该是左移右移来填充吧,cdefgh| abcdefgh|abcdefg
-
-
value:边界颜色
import numpy as np
import cv2 as cv
src = cv.imread("D:/lena.bmp")
src = cv.resize(src, (256, 256))
dst = cv.copyMakeBorder(src, 50, 50, 50, 50,
cv.BORDER_CONSTANT, value=[255, 255, 255])
cv.imshow('BORDER_CONSTANT', dst)
src_gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REFLECT)
cv.imshow('BORDER_REFLECT', dst)
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REFLECT_101)
cv.imshow('BORDER_REFLECT_101', dst)
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REPLICATE)
cv.imshow('BORDER_REPLICATE', dst)
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_WRAP)
cv.imshow('BORDER_WRAP', dst)
cv.waitKey(0)
cv.destroyAllWindows()
天还未黑,云怎敢灰;
雨还未下,风怎敢吹;
瓜还未熟,秧怎敢枯;
花还未落,树怎敢死;
你还未嫁,我怎敢老。
-- 汪国真 《怎敢》