学习OpenCV-Python——基本概念

Ubuntu下使用Anaconda安装OpenCV3:

conda install --channel https://conda.anaconda.org/menpo opencv3

图像的表示

OpenCV使用numpy的array作为图像的数据结构,但是与主流的RGB结构不同的是,OpenCV采用了BGR的结构,这与历史遗留问题有关。

图像的基本属性

img.shape#图像的形状

img.size#图像像素数目

img.dtype#图像像素值的类型,一般为float32或uint8

基本图像处理

图像读写

import cv2
#写图像
#mode可以选择灰度图或者三通道图,默认三通道
#灰度图:cv2.IMREAD_GRAYSACLE
#彩色图像:cv2.IMREAD_GRAYSCALE  #默认
#图像原来是什么就是什么:cv2.IMREAD_UNCHANGED
img = cv2.imread(filename,mode)
#写图像
cv2.imwrite(filename,img)

图像显示

#windows是窗口名字
cv2.imshow(windows_name,img)

窗口销毁

#窗口销毁的函数有两种,分别是
cv2.destroyWindow(windows_name)
#和
cv2.destroyAllWindows()
#区别是销毁单个窗口和所有窗口

cv2.waitKey(time_of_millionseconds)函数

#由于调用imshow()后会马上销毁图像,此时要配合cv2.waitKey()函数使用
#cv2.waitKey()函数的用法有两种,即等待一段时间或等待键盘输入,返回键盘输入的ascii值,若无输入则返回-1
#用法一:
#当参数time_of_millionseconds>0,表示需要等待的毫秒数
if cv2.waitKey(1000):
    cv2.destroyAllWindows()
#用法二:
#当参数<=0时表示一直等待键盘的输入(无输入则无限等待),key_num即输入的字符的ascii码
if cv2.waitKey(0) == key_num:
    cv2.destroyAllWindows()

图像缩放、填充、裁剪

#直接指定大小
#interpolation是插值算法,一般有:
#cv2.INTER_LINEAR: 双线性插值,默认情况使用
#cv2.INTER_NEAREST: 最邻近插值
#cv2.INTER_AREA: 使用像素区域关系重新采样,和cv2.INTER_NEAREST相似
#cv2.INTER_CUBIC: 4x4像素邻域内的双立方插值
img_resize = cv2.resize(img,size,interpolation)
#根据比例缩放
#例:cv2.resize(img,(0,0),fx=0.5,fy=0.5)
img_resize = cv2.resize(img,size,fx,fy)

#分别在上下左右填充的像素的大小
img_border = cv2.copyMakeBorder(img,margin_up,margin_down,margin_left,margin_right)

#图像裁剪
patch_img = img[begin1:end1,begin2:end2]

HSV格式

HSV分别是色调(Hue),饱和度(Saturation)和亮度(Value)

H调整颜色;S越大,图像色彩越丰富,颜色越鲜艳;V越大,图像越亮

相关操作

# H空间中,绿色比黄色的值高一点,所以给每个像素+15,黄色的树叶就会变绿
turn_green_hsv = img_hsv.copy()
turn_green_hsv[:, :, 0] = (turn_green_hsv[:, :, 0]+15) % 180
turn_green_img = cv2.cvtColor(turn_green_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('turn_green.jpg', turn_green_img)

# 减小饱和度会让图像损失鲜艳,变得更灰
colorless_hsv = img_hsv.copy()
colorless_hsv[:, :, 1] = 0.5 * colorless_hsv[:, :, 1]
colorless_img = cv2.cvtColor(colorless_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('colorless.jpg', colorless_img)

# 减小亮度为原来一半
darker_hsv = img_hsv.copy()
darker_hsv[:, :, 2] = 0.5 * darker_hsv[:, :, 2]
darker_img = cv2.cvtColor(darker_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('darker.jpg', darker_img)

图像色彩空间变换函数cv2.cvtColor()

#mode一般为cv2.COLOR_BGR2HSV,cv2.COLOR_HSV2BGR,cv2.COLOR_BGR2GRAY
#cvt就是convert的意思
img_cvt = cv2.cvtColor(img,mode)

绘图函数

OpenCV可以绘制的基本图像有直线cv2.line、长方形cv2.rectangle、圆cv2.circle、椭圆cv2.ellipse、多边形cv2.polylines等,先介绍一下它们的公共参数。

img: 表示需要进行绘制的图像对象ndarray 。
color:表示绘制几何图形的颜色,采用BGR即上述说的(B、G、R) 。
thickness:表示绘制几何图形中线的粗细,默认为1,对于圆、椭圆等封闭图像取-1时是填充图形内部。
lineType:表示绘制几何图形线的类型,默认8-connected线是光滑的,当取cv2.LINE_AA时线呈现锯齿状。

直线:cv2.line()

cv2.line(image, starting, ending, color, thickness, lineType)

参数starting、ending分别表示线的起点像素坐标、终点像素坐标。

长方形:cv2.rectangle()

cv2.rectangle(image, top-left, bottom-right, color, thickness, lineType)

参数top-left、bottom-right分别表示长方形的左上角像素坐标、右下角像素坐标。

圆形:cv2.circle()

cv2.circle(image, center, radius, color, thickness, lineType)

参数center、radius分别表示圆的圆心像素坐标、圆的半径长度,圆绘制函数中当参数thickness = -1 时绘制的是实心圆,当thickness >= 0 时绘制的是空心圆。

椭圆:cv2.ellipse()

cv2.circle(image, center, (major-axis-length, minor-axis-length), angle, startAngle, endAngle, color, thickness, lineType)

椭圆绘制函数中当参数thickness = -1 时绘制的是实心椭圆,当thickness >= 0 时绘制的是空心椭圆,其他参数如下 :

center: 表示椭圆中心像素坐标
major-axis-length: 表示椭圆的长轴长度
minor-axis-length: 表示椭圆的短轴长度
angle: 表示椭圆在逆时针方向旋转的角度
startAngle: 表示椭圆从主轴向顺时针方向测量的椭圆弧的起始角度
endAngle: 表示椭圆从主轴向顺时针方向测量的椭圆弧的终止时角度

多边形:cv2.polylines()

cv2.polylines(image, [point-set], flag, color, thickness, lineType)

point-set: 表示多边形点的集合。
flag: 当flag = True 时,则多边形是封闭的,当flag = False 时,则多边形只是从第一个到最后一个点连线组成的图像,没有封闭。

猜你喜欢

转载自blog.csdn.net/a13602955218/article/details/84195120