python中使用opencv需要导入
import cv2
图像读写
在python中,图像使用numpy数组表示。
读写支持各种静态的图像文件格式(bmp,png, jpg, jpeg)
img = cv2.imread( img_path , [*] ) 读图像 返回的是一个numpy数组。格式(BGR)3通道,即使是灰度图。
cv2.imwrite( img_path , img ) 写图像。要求通道是(BGR)或者灰度格式。
cv2.waitKey() 参数1:等待时间,单位毫秒。
一般与cv2.imshow()搭配使用,另一个实用的功能就是通过按键进入if条件语句
exp1:
比如下面按ESC关闭窗口,退出循环,结束程序。
cv2.imshow("Origin", image)
key = cv2.waitKey(1)
if key == 27:
cv2.destroyAllWindows()
break
图像转换
img = cv2.cvtColor( img, cv2.COLOR_GRAY2BGR) 将单通道图像,转变为3通道(BGR)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 转换为灰度图
img.reshape(h,w,c) 重新定义数组的维度。 h , w , c
void resize(
InputArray src, //输入原图像
OutputArray dst, //输出结果图像
Size dsize, //设定结果图像的尺寸
double fx = 0, //在x轴上的缩放比例
double fy = 0, //在y轴上的缩放比例
int interpolation = INTER_LINEAR //差值方式(计算新图像的各点像素)
);
src:待变换输入原图,可以为单通道灰度图像,也可以为3通道彩色图像
dsize:变换后的图像尺寸,格式:宽高通道;当dsize为0时,它可以通过以下公式计算得出:
dsize = Size(round(fxs*rc.cols), round(fy*src.rows))
fx - 水平轴上的比例因子。当它为0时,计算公式如下:(double)(dsize.width/src.cols)
fy - 垂直轴上的比例因子。当它为0时,计算公式如下:(double)(dsize.heifht/src.rows)
interpolation - 插值方法
interpolation取值:INTER_NEAREST - 最近邻插值法
interpolation取值:INTER_LINEAR - 双线性插值法(默认)
interpolation取值:INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。
对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
interpolation取值:INTER_CUBIC - 基于4x4像素邻域的3次插值法
interpolation取值:INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
注意:参数dsize和参数(fx, fy)不能够同时为0
通道分离
void split(
const Mat& src, //待分离的多通道矩阵
Mat* mvbegin //矩阵数组,保存分离后的单通道矩阵
);
void split(
InputArray m, //待分离的多通道矩阵
OutputArrayOfArrays mv //vector容器,保存分离后的单通道矩阵
);
通道融合
void merge(
const Mat* mv, //矩阵数组,包含多个待融合单通道矩阵
size_t count, //需要融合的矩阵数目
OutputArray dst //输出结果(融合后的多通道矩阵)
);
void merge(
InputArrayOfArrays mv, //vector容器,包含多个待融合单通道矩阵
OutputArray dst //输出结果(融合后的多通道矩阵)
);
图像旋转
M = cv2.getRotationMatrix2D((width/2, height/2), angle, scale)
# M为旋转矩阵,第一个参数是设定旋转中心,第二个参数是旋转角度(单位是度,逆时针为正),第三个参数是缩放比例
ratation = cv2.warpAffine(image, M, (width, height))
图像索引
图像是以numpy数组形式存储,就可以看成三维数组,任何numpy支持的操作,都可以操作图像。最方便的莫过于索引和切片。
img[i,j,k] i 表示y 坐标, j 表示x坐标, k表示通道
img.itemset( (10,10 ,0), 255) 设置像素值
img.item(( 10 ,10 ,0)) 获取像素值
图像属性
img.shape 返回包含宽度,高度和通道数的数组
img.size 返回图像像素的大小
img.dtype 图像的数据类型,int or float
绘图
cv2.putText() 参数1:图像,参数2:文字内容,参数3:坐标位置,参数4:字体,参数5:字号,参数6:颜色,参数7:字体粗细
cv2.rectangle() 参数1:图像,参数2:左上角坐标,参数3:右下角坐标,参数4:框的颜色,参数5:框的粗细
void line(
InputOutputArray img, //要绘制线段的图像
Point pt1, //线段的起点
Point pt2, //线段的终点
const Scalar& color, //线段的颜色,通过一个Scalar对象定义
int thickness = 1, //线条的宽度
int lineType = LINE_8, //线段的类型,默认值为8邻接
int shift = 0 //坐标点小数点位数
);
void circle(
InputOutputArray img, //输入输出图像
Point center, //圆心坐标
int radius, //圆的半径
const Scalar& color, //圆的颜色,Scalar(B, G, R)
int thickness = 1, //圆的线条宽度,正数表示线条的粗细程度,负数表示圆被填充
int lineType = LINE_8, //线条的类型
int shift = 0 //圆心坐标点和半径值的小数点位数
);
图像处理
高斯平滑滤波 cv2.GaussianBlur() 参数1:图像,参数2:滤波器大小,参数3:标准差
gray = cv2.GaussianBlur(gray,(3,3),0) #模糊图像
中值滤波 cv2.medianBlur() 参数1:图像,参数2:滤波尺寸
gray = cv2.medianBlur(gray,5) # 填充白色噪点
均值滤波
void blur(
InputArray src, //待均值滤波的输入图像
OutputArray dst, //滤波后的输出图像
Size ksize, //滤波器尺寸(大于1的奇数)
Point anchor = Point(-1,-1), //滤波器中心位置
int borderType = BORDER_DEFAULT //边界模式,用于推断图像外部像素的某种边界模式
);
高斯滤波
void GaussianBlur(
InputArray src, //待高斯滤波的输入图像
OutputArray dst, //滤波后的输出图像
Size ksize, //滤波器尺寸(大于1的奇数)
double sigmaX, //高斯核函数在X方向上的标准差
double sigmaY = 0, //高斯核函数在Y方向上的标准差
int borderType = BORDER_DEFAULT //边界模式,用于推断图像外部像素的某种边界模式
);
中值滤波
void medianBlur(
InputArray src, //待中值滤波的输入图像,要求为1通道、3或4通道图像
OutputArray dst, //滤波后的输出图像
int ksize //滤波器尺寸(大于1的奇数)
);
阈值分割函数
double threshold(
InputArray src, //输入图像
OutputArray dst, //输出图像
double thresh, //阈值
double maxval, //使用 BINARY 或 BINARY_INV 方法时的最大值
int type //选用 OpenCV 提供的阈值分割方法
);
网友评论