opencv python接口用法

2019-08-17  本文已影响0人  gpfworld

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 提供的阈值分割方法
                );

上一篇下一篇

猜你喜欢

热点阅读