open CV对图像的各类操作

本文章用于记录自己使用open CV过程中的要点,便于遗忘时查看。

首先使用

using namespace std;
using namespace cv;

避免每次都需要敲 ::cv及::std;

图像的读写显示存取

图像定义:

Mat image;

图像读取:

imread(const String & filename,int flags = IMREAD_COLOR);

    支持格式有:

  • Windows bitmaps - *.bmp, *.dib (always supported)
  • JPEG files - *.jpeg, *.jpg, *.jpe (see the Notes section)
  • JPEG 2000 files - *.jp2 (see the Notes section)
  • Portable Network Graphics - *.png (see the Notes section)
  • WebP - *.webp (see the Notes section)
  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
  • Sun rasters - *.sr, *.ras (always supported)
  • TIFF files - *.tiff, *.tif (see the Notes section)
  • OpenEXR Image files - *.exr (see the Notes section)
  • Radiance HDR - *.hdr, *.pic (always supported)
  • Raster and Vector geospatial data supported by Gdal (see the Notes section)

    读取方式有:

IMREAD_UNCHANGED                                        按照图片原格式读入.
IMREAD_GRAYSCALE                                         将图片转为单通道灰色图.
IMREAD_COLOR                                                 将图片转为BGR3通道 .
IMREAD_ANYDEPTH                                           如果图片是16-bit/32-bit ,则保持不变,其他的都转为8-bit.
IMREAD_ANYCOLOR                                          图像以任何可能的颜色格式读取.
IMREAD_LOAD_GDAL                                        使用GDAL载入图像.
IMREAD_REDUCED_GRAYSCALE_2                  将图片转为单通道灰色图,同时将图片尺寸裁剪到 1/2.
IMREAD_REDUCED_COLOR_2                          将图片转为BGR 3通道,同时将图片尺寸裁剪到 1/2.
IMREAD_REDUCED_GRAYSCALE_4                  将图片转为单通道灰色图,同时将图片尺寸裁剪到  1/4.
IMREAD_REDUCED_COLOR_4                          将图片转为BGR 3通道,同时将图片尺寸裁剪到 1/4.
IMREAD_REDUCED_GRAYSCALE_8                  将图片转为单通道灰色图,同时将图片尺寸裁剪到 1/8.
IMREAD_REDUCED_COLOR_8                          将图片转为BGR 3通道,同时将图片尺寸裁剪到 1/8.
IMREAD_IGNORE_ORIENTATION                        如果设置,不旋转图像根据EXIF的定位标志

显示图像:

imshow(const String & winname, InputArray mat);

显示窗口:

namedWindow(const String & winname,int flags = WINDOW_AUTOSIZE)  

  • WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小
  • WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
  • WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。
waitKey(int delay = 0)

这个函数用来等待,读取和处理事件。当我们没有输入,只需要窗口停留,就可以将参数设为0。

图像保存:

imwrite(const String & filename InputArray img, const vector< int > & params = vector< int >())  

图像缩放、旋转、截取、叠加

缩放

resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
InputArray src     -原图像 
OutputArray dst    -输出图像 
Size dsize         -目标图像的大小 
double fx=0        -在x轴上的缩放比例 
double fy=0        -在y轴上的缩放比例 
int interpolation  -插值方式,有以下四种方式 

    INTER_NN      -最近邻插值 
    INTER_LINEAR  -双线性插值 (缺省使用) 
    INTER_AREA    -使用象素关系重采样,当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 INTER_NN 方法。 
    INTER_CUBIC   -立方插值。 

dsize与(fx,fy)不能同时为0

旋转:

Mat rotMat;Point rotCenter = Point(x,y);    //    x,y为旋转中心坐标
rotMat = getRotationMatrix2D(Point2f center, double angle, double scale);//获取旋转矩阵,angle为逆时针;scale为缩放比例.
warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar()); 

根据getAffineTransform或getRotationMatrix2D得到的变换矩阵,计算变换后的图像。

src为输入图像

dst为变换后图像,类型与src一致。

M为变换矩阵,需要通过其它函数获得,当然也可以手动输入。
dsize为输出图像的大小

flags,插值算法,详细如下:

    INTER_NEAREST        = 0,  //最近邻插值  
    INTER_LINEAR         = 1, //双线性插值  
    INTER_CUBIC          = 2, //双三次插值  
    INTER_AREA           = 3, //区域插值,使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。
    INTER_LANCZOS4       = 4, //Lanczos插值(超过8×8像素邻域的Lanczos插值) 
    INTER_MAX            = 7,  
    WARP_FILL_OUTLIERS   = 8, //填充所有输出图像的象素  
    WARP_INVERSE_MAP     = 16  //逆变换

borderMode为边界处理方式:

    BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`  
    BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`  
    BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`  
    BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`  
    BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`  
    BORDER_TRANSPARENT = 5, //!< `uvwxyz|absdefgh|ijklmno`  
    BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101  
    BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101  

    BORDER_ISOLATED    = 16 //!< do not look outside of ROI  

截取:

Mat imageROI;
imageROI = image(Rect(100, 100, 400, 400));

或者用:

imageROI = image(Range(100, 400),Range(100, 400));

叠加:

addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
公式为: dst = src1*alpha + src2*beta + gamma;

注意:图像大小必须一致。如果不一致,可以用ROI方法:

首先在原图中取出需要添加的位置图像:

imageROI = image(Rect(200, 200, image_to_add.cols, image_to_add.rows));

然后将需要添加的图像融合:

addWeighted(image_to_add, 0.8, imageROI, 0.1, 0., imageROI);
这样需要叠加的图像 image_to_add 就添加到imageROI区域了。
直方图、梯度、滤波

直方图:
        参考:点击打开链接

sobel算子计算梯度:

        参考:点击打开链接

直方图均衡:

equalizeHist(InputArray src,
             OutputArray dst 
);

中值滤波:

blur(InputArray src,
     OutputArray dst,
     Size ksize,
     Point anchor = Point(-1,-1),
     int borderType = BORDER_DEFAULT 
);
高斯滤波:
GaussianBlur(InputArray src,
             OutputArray dst,
             Size ksize,
             double sigmaX,
             double sigmaY = 0,
             int borderType = BORDER_DEFAULT 
);
双边滤波:
bilateralFilter(InputArray src,
                OutputArray dst,
                int d,
                double sigmaColor,
                double sigmaSpace,
                int borderType = BORDER_DEFAULT 
);
方框滤波:
boxFilter(InputArray src,
          OutputArray dst,
          int ddepth,
          Size ksize,
          Point anchor = Point(-1,-1),
          bool normalize = true,
          int borderType = BORDER_DEFAULT 
);

颜色空间转换

参考:点击打开链接

边缘、轮廓

用Sobel计算边缘

 假定输入图像矩阵为 I,卷积核大小为 3x3,则水平一阶导数 Gx 和垂直一阶导数 Gy 分别为:

Gx=121000121IGy

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值