【OpenCV】图像处理(三)漫水填充+尺寸调整

【漫水填充法】

首先,漫水填充在图像处理中是做什么的?

漫水填充,经常被用来标记或分离图像中的一部分,以便对其进行进一步的处理或者分析。漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点。

漫水填充的过程是怎样的?

漫水填充操作的结果总是在某个连续的区域。当邻近像素点位于给定的范围(从loDiff到upDiff)内或在原始seedPoint像素值范围内事,cvFloodFill()函数将为这个点涂上颜色。可以选参数mask控制漫水法填充。OpenCV中给出了函数cvFloodFill(),下面简介下这个函数。

void cvFloodFill(
    IplImage*     img,//输入图像,8位或者浮点类型的单通道或三通道图
    CvPoint       seedPoint, //种子坐标
    CvScalar      newVal,//像素点被染色的值
    CvScalar      loDiff= cvScalarAll(0),//像素值的下限差值
    CvScalar      upDiff= cvScalarAll(0),//像素值的上限差值
    CvConnectedComp* comp=NULL,
    int           flags=4,//这个参数略复杂,下文介绍下

    //mask是掩码,既可以作为输入,也可以作为输出,若mask非空,
    //那么它必须为一个单通道、8位、源图像为width * height,
    //则掩码大小为 (width+2) * (height+2)
    CvArr*        mask=NULL 
)

关于flags参数,低八位可以被设置为4或者8,这个参数控制着填充算法的连通性,4表示在4个方向考虑连通性(上下左右), 8表示在8个方向考虑连通性(加上4个对角线方向),高八位可以设置CV_FLOODFILL_FIXED_RANGE,或者 CV_FLOODFILL_MASK_ONLY(如果设置只考虑填充MASK),flags的中间比特(8-15位)的值可以设置填充掩码的值 flags = 8 | CV_FLOODFILL_MASK_ONLY | CV_FLOODFILL_FIXED_RANGE | (43<<8)

下面给出漫水填充法函数应用的示例:

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;

int main()
{
    IplImage* src = cvLoadImage("1.jpg", CV_LOAD_IMAGE_UNCHANGED);
    cvShowImage("source", src);
    IplImage* image1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
    IplImage* image2 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);

    cvCopy(src, image1);
    cvCopy(src, image2);

    cvFloodFill(
        image1,
        cvPoint(54, 82),
        CV_RGB(255, 0, 0),
        cvScalar(20, 30, 40, 0),
        cvScalar(20, 30, 40, 0),
        NULL,
        4,
        NULL
        );
    cvShowImage("dst1", image1);

    cvFloodFill(
        image2,
        cvPoint(88,88),
        CV_RGB(255, 0, 0),
        cvScalar(20, 30, 40, 0),
        cvScalar(20, 30, 40, 0),
        NULL,
        4,
        NULL
        );
    cvShowImage("dst2", image2);

    cvWaitKey();
    cvReleaseImage(&src);
    cvReleaseImage(&image1);
    cvReleaseImage(&image2);
    cvDestroyAllWindows();

    return 0;

}

【尺寸调整】

首先,尺寸调整,顾名思义,就是将某种尺寸的图像转换为其他尺寸的图像。在OpenCV中有函数cvResize(),此函数可以将源图像精确转换为目标图像的尺寸。若源图像设置了ROI,那么函数会对ROI调整尺寸,以匹配目标图像。函数比较简单。

void cvResize(
    const  CvArr*  src,
    CvArr*         dst,
    int            interpolation=CV_INTER_LINEAR //插值方法
)

关于interpolation,有如下列表:

这里写图片描述

一般情况下,我们期望源图像和重采样后的目标图像之间的映射尽可能平滑,而参数 interpolation就是控制如何映射。当缩小图像时,目标图像的像素会映射为源图像中的多个像素,这时需要插值。当放大图像时,目标图像上的像素可能无法在源图像中找到精确对应的像素,也需要进行插值。

CV_INTER_NN: 将目标图像各点的像素值设为源图像中与其距离最近点的像素值
CV_INTER_LINEAR: 将根据图像附近的4个(2×2范围)邻近像素的线性加权计算得出,权重由4个像素到精确目标点的距离决定
CV_INTER_AREA: 新的像素点覆盖原来的像素点,然后求取覆盖区域的平均值
CV_INTER_CUBIC: 首先对源图像附近的4×4个邻近像素进行三次样条拟合,然后将目标图像对应的三次样条值作为目标图像对应像素点的值

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页