OpenCV实现图片的膨胀和腐蚀

NDK 之C++篇开篇

今天是NDKC++篇的第一课,当然也会讲很多的C的相关知识.有一件事需要提前跟大家说声抱歉,讲完这节课NDK可能需要暂停一段时间(大概一个半月).
为什么呢?因为之前写的两篇文章访问量并不高,好多人也向我反应没有干货.我当然不能否认,因为在写之前做的准备的确不多,之后的一段时间我会抽时间然后给大家准备更精彩的内容,不过我还是会不定期的给大家更新一些android原生的东西.希望大家都能有所收货吧.
下面是C++篇的重要部分—OpenCV的第一课,也是我将要开始的NDK中的主线内容.

OpenCV

关于OpenCV的基础知识,以及它的诸多背景这里我不在多说,因为这些东西对与程序员是很容易找到的,关于OpenCV的安装和环境配置有兴趣研究的同学可以在最下方加我的qq联系.

OpenCV图像的形态学操作 – 膨胀(erode)与腐蚀(dilate)

形态学操作:

基于形状的一系列图像处理操作,通过将结构元素作用于输入图像产生输出图像.(我不太擅长总结,所以智能直接把翻译者给的定义拿过来了)
而形态学最简单的操作就是膨胀与腐蚀

膨胀


此操作将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积。


内核 B 有一个可定义的 锚点, 通常定义为内核中心点。


进行膨胀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。对上图采用膨胀操作我们得到:

腐蚀


腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。


进行腐蚀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最小相素值提取,并代替锚点位置的相素。


以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了。

下面的图像的形状变画丢应上面的膨胀与腐蚀
这里写图片描述

这里写图片描述
* 注意**

图像的腐蚀与膨胀与图像的放大和缩放是完全不同的概念
因为图像的膨胀和腐蚀是对关键区域的像素进行处理过的,动图中图片在进行缩放和腐蚀的时候,实际上的背景是没有任何变化的.(只不过因为背景是白色看不出来而已)

代码

#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<highgui.h>
#include<stdio.h>
#include<stdlib.h>

using namespace cv;
int erosion_size = 0;
int dilation_size = 0;
int const max_kernel_size = 21;
Mat src, dst_diolate, dst_erosion;
void Dilation(int, void*);
void Erosion(int, void*);
int main(int argc, char* argv[])
{
    src = imread("hope.jpg");
    namedWindow("Dilation Demo", CV_WINDOW_AUTOSIZE);
    namedWindow("Erosion Demo", CV_WINDOW_AUTOSIZE);

    cvMoveWindow("Dilation Demo", src.cols, 0);
    cvMoveWindow("Erosion Demo", src.cols, 0);

    /// 创建膨胀 Trackbar


    createTrackbar("我要膨胀", "Dilation Demo",
        &dilation_size, max_kernel_size,
        Dilation);
    createTrackbar("我要膨胀", "Erosion Demo",
        &erosion_size,max_kernel_size,
        Erosion);

    Dilation(0,0);
    Erosion(0, 0);
    imshow("src", src);
    waitKey();

    return  0;
}
void Dilation(int, void*)
{

    // dst = Mat::zeros(src.size(), src.type());
    int erosion_type = MORPH_CROSS;
    Mat ele = getStructuringElement(erosion_type,
        Size(2 * dilation_size + 1, 2 * dilation_size + 1),
        Point(dilation_size, dilation_size));
    dilate(src, dst_diolate, ele);

    imshow("Dilation Demo", dst_diolate);
}
void Erosion(int, void*)
{
    int erosion_type = MORPH_CROSS;
    Mat element = getStructuringElement(erosion_type,
        Size(2 * erosion_size + 1, 2 * erosion_size + 1),
        Point(erosion_size, erosion_size));
    ///膨胀操作
    erode(src, dst_erosion, element);
    imshow("Erosion Demo", dst_erosion);
}

代码释义

imread 读图像

getStructuringElement 指定腐蚀操作的内核,默认为一个简单的3*3矩阵

dilate 膨胀操作

erode 腐蚀操作

代码的讲解比较简单,因为我觉得程序原理相通又比较短,容易理解,需要opencv Api文档的同学可以加我的qq.

联系我

QQ:1275054668

Email:pook216@163.com

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值