图像处理 数学形态学
2017-04-14 20:58:33 u010368556 阅读数 272

形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-most discriminative)的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。

本文主要包括以下内容

  • 二值图像的基本形态学运算, 包括腐蚀、膨胀、开和闭。
  • 二值形态学的经典应用, 包括击中击不中变换、边界提取和跟踪、区域填充、提取连通分量、细化和像素化, 以及凸壳
  • 灰度图像的形态学运算, 包括灰度腐蚀、灰度膨胀、灰度开和灰度闭
  • 本章的典型案例分析
    • 在人脸局部图像中定位嘴的中心
    • 显微镜下图像的细菌计数
    • 利用顶帽变换(top-hat)技术解决光照不均问题
2016-04-06 21:24:03 qiusuoxiaozi 阅读数 948

感觉关于这个资料似乎不多,不明觉厉的MM(Mathematical Morphology,数学形态学)。
http://wenku.baidu.com/link?url=gTpMhuwEzuWLFjtWQpJx4MdHG96J16kQseGBqqfgOrWilL1vJWTt2k2Q7dwEnkIw559hTaHUqyRePzxiG-zvlpxAbKv0Q_9Z2elso0IFrV_

2017-11-20 16:04:24 qq_33414271 阅读数 1624

数学形态图像处理的方法基本有膨胀,腐蚀,开运算,闭运算

  • 腐蚀的作用是消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点;
  • 膨胀的作用是将与物体接触的所有背景点合并到物体中,使目标增大,可添补目标中的空洞。
  • 开运算是先腐蚀后膨胀的过程,可以消除图像上细小的噪声,并平滑物体边界。
  • 闭运算是先膨胀后腐蚀的过程,可以填充物体内细小的空洞,并平滑物体边界。
clc,clear
I=imread('circbw.tif');
imshow(I),title('原始图像');
%腐蚀操作
se=strel('square',3);
Ie=imerode(I,se);
figure,imshow(Ie),title('腐蚀之后的图像');
%膨胀操作
Id=imdilate(I,se);
figure,imshow(Id),title('膨胀之后的图像');
%开运算——先腐蚀后膨胀
Io=imdilate(Ie,se);
figure,imshow(Io),title('开运算之后的图像');
%闭运算——先膨胀后腐蚀
Ic=imerode(Id,se);
figure,imshow(Ic),title('闭运算之后的图像');

%边缘提取--第1种方法,原图减去腐蚀之后的结果
Iout1=I-Ie;
figure,imshow(Iout1),title('边界提取之后的图像');
%边缘提取--第2种方法,bwperim()
Iout1=bwperim(I,4);
figure,imshow(Iout1),title('bwperim边界提取之后的图像');

运行结果:
这里写图片描述

进行周长的计算(手动估算,边界提取计算,自带的周长计算函数):

clc,clear
I=imread('C:\Users\admin\Desktop\圆形黑白图.bmp');
imshow(I)
imtool(I)
%估算周长为:338px * pi--1061px

%边界提取求周长--953px
[width,height]=size(I);
Iout1=bwperim(I,4);
figure,imshow(Iout1),title('bwperim边界提取之后的图像');
pxNum=0;
for i =1:width
    for j =1:height
        if(Iout1(i,j)>0 )
          pxNum=pxNum+1;
        end
    end
end


%matlab自带函数求周长--1058px
p=regionprops(I,'Perimeter');
2017-11-20 21:55:00 qq_33414271 阅读数 2370

已知如下一张雪花的图片,怎么提取特定半径雪花呢?
这里写图片描述

matlab官方demo:http://cn.mathworks.com/help/images/examples/granulometry-of-snowflakes.html

  1. 读取图片并增强对比度
%雪花粒度测量法
%http://cn.mathworks.com/help/images/examples/granulometry-of-snowflakes.html
clc,clear
I = imread('snowflakes.png');
figure
imshow(I)
% Enhance Contrast  增强对比度
claheI = adapthisteq(I,'NumTiles',[10 10]);%将图像a进行直方图均衡化
figure,imshow(claheI)
claheI = imadjust(claheI);%调节灰度图像的亮度或彩色图像的颜色矩阵。
figure,imshow(claheI)

图片前后变化:
这里写图片描述
2. 进行开运算并统计保留下来的像素数量

radius_range = 0:22;
intensity_area = zeros(size(radius_range));
for counter = radius_range
    % strel('disk', counter)表示创建一个圆盘用来消除半径小于counter个像素的元素
    %效果为直接开运算
    remain = imopen(claheI, strel('disk', counter));
    %remain中半径小于counter个像素的元素已经被删除
    %有强烈对比的图片中留下来的像素个数(非零的),共23个结果
    intensity_area(counter +1) = sum(remain(:));  %counter +1是因为下标索引必须为正整数类型或逻辑类型。
end
figure
plot(intensity_area, 'm - *')
grid on
title('图像保留下来的像素数量')
xlabel('打开时使用的构造器半径大小(像素)')
ylabel('打开图片的像素数量(高对比的)')

其中创建了23个结构元素进行腐蚀和膨胀,得到23个结果。imopen为开运算
这里写图片描述

  1. 统计像素值差异
intensity_area_prime = diff(intensity_area); %即intensity_area中像素个数差异,差异绝对值小说明差的不多
figure
plot(intensity_area_prime, 'm - *')
grid on
title('雪花粒度大小分布')
ax = gca;
ax.XTick = [0 2 4 6 8 10 12 14 16 18 20 22];
xlabel('打开时使用的构造器半径大小(像素)')
ylabel('此半径下的像素值差异')

这里写图片描述

4.提取5像素半径的雪花

%提取5像素半径的雪花
open5 = imopen(claheI,strel('disk',5));%5,6时的像素差异最大
figure,imshow(open5),title('open5')
open6 = imopen(claheI,strel('disk',6));
figure,imshow(open6),title('open6')
%open5 - open6,不是反过来,如果反过来图像就没有了(根据形态学腐蚀的道理:半径大的结构元素进行腐蚀,留下来的图像就小)
rad5 = imsubtract(open5,open6);
figure,imshow(rad5,[])

open5和open6:
这里写图片描述

提取出来的雪花:
这里写图片描述

2013-11-21 16:43:51 Stk_OverFlow 阅读数 2959

a部分练习的是图像相减法图像的减法又称减影技术,是指对同一景物在不同时间拍摄的图像或同一景物在不同波段的图像进行相减。

其主要作用如下:

1、去除不需要的叠加性图案;

2、运动检测;

3、梯度图像。

 

这是两张在不同时刻拍摄的图像,为了充分展示出效果,我将图像中的物体移动了一下:

图    一

图    二

这两幅图像相减,并取绝对值之后的结果图像:

 图    三

可以看出,图像相减可以去除两张图像中相同的部分,找出两幅图像中不同的部分。

 

b部分对图三(即图像相减的结果图像)先进行腐蚀(Erosion)操作,再进行膨胀(Dilation)操作,实际上就是一个形态学开运算(Opening)。

图三执行形态学开运算后的结果图像:


图    四

其结果和图三比较,可以看出开运算的结果是去除了小的明亮区域,并且剩余的明亮区域被隔绝,但其大小不变。

 

c部分对图三(即图像相减的结果图像)先进行膨胀操作,再进行腐蚀操作,实际上就是一个形态学闭运算(Closing)。

图三执行形态学开运算后的结果图像:

图    五

其结果和图三比较,可以看出闭运算的结果是填充了明亮的对象内细小的黑暗空洞,连接了邻近对象,但其基本的大小不变。

 

总而言之,开运算常用于去除小的亮点,闭运算去除小的暗点。

最后,贴上代码:

#include <stdio.h>
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv_libs247d.h>


int main()
{
    IplImage * src1 = cvLoadImage("frame_28.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    IplImage * src2 = cvLoadImage("frame_52.bmp", CV_LOAD_IMAGE_GRAYSCALE);

    IplImage * diff12 = cvCreateImage(cvGetSize(src1), src1->depth, src1->nChannels);
    IplImage * cleandiff = cvCreateImage(cvGetSize(src1), src1->depth, src1->nChannels);
    IplImage * dirtydiff = cvCreateImage(cvGetSize(src1), src1->depth, src1->nChannels);

    cvAbsDiff(src1, src2, diff12);
    
    // Opening
    cvErode(diff12, cleandiff, NULL, 1);
    cvDilate(cleandiff, cleandiff, NULL, 1);

    // Closing
    cvDilate(diff12, dirtydiff);
    cvErode(dirtydiff, dirtydiff);

    cvShowImage("abs diff", diff12);
    cvShowImage("clean diff", cleandiff);
    cvShowImage("dirty diff", dirtydiff);

    cvSaveImage("absdiff.png", diff12);
    cvSaveImage("cleandiff.png", cleandiff);
    cvSaveImage("dirtydiff.png", dirtydiff);

    cvSaveImage("src1.png", src1);
    cvSaveImage("src2.png", src2);

    cvWaitKey(0);

    cvReleaseImage(&src1);
    cvReleaseImage(&src2);
    cvReleaseImage(&diff12);
    cvReleaseImage(&cleandiff);
    cvReleaseImage(&dirtydiff);
    cvDestroyAllWindows();

    return 0;
}

没有更多推荐了,返回首页