Open CV 图像处理

1、平滑处理(blurring)

void cvSmooth(
    const CvArr* src,
    CvArr* dst,
    int smoothtype = CV_GAUSSIAN,
    int param1 = 3,
    int param2 = 0,
    double param3 = 0,
    double param4 = 0
);
平滑类型名称支持No输入数据类型输出数据类型简要说明
CV_BLUR简单模糊1,38u, 32f8u,32f对每个像素 param1 x param 2 领域求和,并做缩放 1/(param1 param2)
CV_BLUR_NO_SCALE简单无缩放变换的模糊18u16s 或 32f对每个像素的 param1 x param2邻域求和
CV_MEDIAN中值模糊1,38u8u对图像进行核大小为 param1 x param 的中值滤波
CV_GAUSSIAN
高斯模糊1,38u,32f8u,32f对图像进行核大小为param1 x param2 的高斯卷积
CV_BILATERAL
双边滤波1,38u 8u应用双线性 3 x 3 滤波,颜色 sigma=param1, 空间 sigma=param2


1568822446610498.png1568822831285227.png
简单图像平滑处理中值滤波进行的图像模糊处理
1568823254154903.png1568823490676617.png
高斯模糊双边滤波


图像形态学

基本的形态转换是膨胀与腐蚀

膨胀是指将一些图像与核进行卷积。

image.png

 形态学膨胀:在核B 下取最大像素值


膨胀可以填补凹洞,腐蚀能够消除细的凸起。

void cvErode (
    IplImage* src,
    IplImage* dst,
    IplConvKernel* B = NULL,
    int iterations = 1
);

void cvDilate (
    IplImage* src,
    IplImage* dst,
    IplConvKernel* B = NULL,
    int iterations = 1
);

腐蚀,膨胀公式:

image.png

自定义核

IplConvKernel* cvCreateStructuringElementEx(
    int cols,
    int rols,
    int anchor_x,
    int anchor_y,
    int shape,
    int* values=NULL
);
void cvReleaseStructuringElement(IplConvKernel** element);

IplConvKernel 的形状取值

形状值含义
CV_SHAPE_RECT核是矩形
CV_SHAPE_CROSS核是十字交叉形
CV_SHAPE_ELLIPSE核是椭圆形
CV_SHAPE_CUSTOM核是用户自定义的值



更通用的形态学

void cvMorphologyEx (
    const CvArr* src,
    CvArr* dst,
    CvArr* temp,
    IplConvKernel* element,
    int operation,
    int iterations = 1
);

cvMorphologyEx()操作选项:

操作名称形态学操作是否需要临时图像
CV_MOP_OPEN开运算
CV_MOP_CLOSE闭运算
CV_MOP_GRADIENT态度梯度总是
CV_MOP_TOPHAT“礼帽”in-place 情况下 (src=dst)需要
CV_MOP_BLACKHAT“黑帽”in-place 情况下 (src=dst)需要


开运算:首先腐蚀然后再膨胀。开运算通常用来统计二值图像中的区域数。若已将显微镜载玻片上观察到的细胞图像做了阈值化处理,可以使用开运算将相邻的细胞分离开来,然后再计算图像中的区域(细胞)数目。

闭运算:先将其膨胀然后再腐蚀。对于连通区域分析,通常先采用腐蚀或闭运算来消除纯粹有噪声引起的部分,然后用开运算来连接相邻近的区域。


开运算和闭运算最显著的效果是:闭运算消除来低于其邻近点的孤立点,而开运算是消除高于其邻近点的孤立点


1568990568549504.png1568990598702629.png
开运算闭运算


形态学梯度


公式:

gradient(src) = dilate(src) - erode(src)

对二值图像进行这一操作可以将团块(blob)的边缘突出出来。

1568991192842616.png
形态学梯度


礼帽和黑帽


TopHat(src) = src - open(src)

BlackHat(src) = close(src) - src

礼帽操作:从A中减去A的开运算,目的放大裂缝或局部低亮区域。

黑帽操作:突出A周围的区域黑暗的区域。

1568991809622869.png1568991826147873.png
礼帽黑帽


漫水填充算法

void cvFloodFill(
    IplImage* img,
    CvPoint seedPoint,
    CvScalar newVal,
    CvScalar loDiff = cvScalarAll(0),
    CvScalar upDiff = cvScalarAll(0),
    CvConnectedComp*  comp = NULL,
    int flags = 4,
    CvArr* mask = NULL
);
1568996084333573.png
漫水填充


尺寸调整

void cvResize(
    const CvArr* src,
    CvArr* dst,
    int Interpolation = CV_INTER_LINEAR
);

cvResize 插值方法

插值方法含义
CV_INTER_NN最近邻插值
CV_INTER_LINEAR线性插值
CV_INTER_AREA区域插值
CV_INTER_CUBIC三次样条插值


图像金字塔

void cvPyrDown(
    IplImage* src,
    IplImage* dst,
    IplFilter filter = IPL_GAUSSIAN_5X5
);
void cvPyrUp(
    IplImage* src,
    IplImage* dst,
    IplFilter filter = IPL_GAUSSIAN_5X5
);

拉普拉斯金字塔第i 层的数学定义:

image.png

image.png

金字塔分割

void cvPysSegmentation(
    IplImage* src,
    IplImage* dst,
    CvMemStorage* storage,
    CvSeq** comp,
    int level,
    double threshold1,
    double threshold2
);
1569052075632776.png
金字塔分割的阈值 threshold1 设置为150, 阈值threshold2设置为30


使用如下命令可以分配存储区域:

CvMemStorage* storage = cvCreateMemStorage();


comp 参数用于存储分割结果更详细的信息-- 存储器里一序列相连的组成部分。

示例:

void f( ImlImage* src, IplImage* dst) {
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* comp = NULL;
    cvPyrSegmentation(src, dst, storage, &comp, 4,200,50);
    int n_comp = comp->total;
    for( int i = 0 ; i< n_comp; i++) {
        CvConnectedComp* cc = (CvConnectedComp*) cvGetSeqElem(comp,i);
        do_something_with( cc);
    }
    cvReleaseMemStorage( &storage);
}
typedef struct CvConnectedComponent {
    double area;
    CvScalar value;
    CvRect rect;
    CvSeq* contour;
};


阈值化

double cvThreshold (
    CvArr* src,
    CvArr* dst,
    double threshold,
    double max_value,
    int threshold_type
);

cvThreshold() 中阈值类型选项和对应的操作

阈值类型操作
CV_THRESH_BINARYdist= (srci > T) ? M : 0
CV_THRESH_BINARY_INVdist= (srci > T) ? 0 : M
CV_THRESH_TRUNCdist= (srci > T) ? M : srci
CV_THRESH_TOZERO_INVdist= (srci > T) ? 0 : srci
CV_THRESH_TOZEROdist= (srci > T) ? src: 0 


自适应阈值

void cvAdaptiveThreshold(
    CvArr* src,
    CvArr* dst,
    double max_val,
    int apaptive_method = CV_ADAPTIVE_THRESH_MEAN_C,
    int threshold_type = CV_THRESH_BINARY,
    int block_size = 3,
    double param1 = 5
);

针对很强照明或反射梯度的图像,需要根据梯度进行阈值化时,自适应阈值技术非常有用。

1569073881980155.png





标签: OpenCV C/C++
相关文章
评论留言
发布留言