2018-06-07 14:56:17 qq_37764129 阅读数 12028
  • Tensorflow-图像处理视频教程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 课程以图像处理软件Tensorflow作为核心武器,基于图像处理热点话题进行案例实战。选择当下热门模型,使用真实数据集进行实战演示,通俗讲解整个算法模型并使用tensorflow进行实战,详解其中的原理与代码实现。

    1330 人正在学习 去看看 唐宇迪

本Project要对一下图像进行处理,去掉指纹周围的雾。这里采用matlab软件来对图像进行批量处理。

源代码:https://download.csdn.net/download/qq_37764129/10384282

待处理图像如图1所示:

    在本项目中,采用了Sobel边缘检测算子进行指纹的提取,通过膨胀腐蚀去除了部分面积较小的雾点,以第20号图即这里的待处理图像(4)为例得到图a即下面的图3-1。

    用find函数提取经前几步处理后二值图像中的所有黑色区域即背景的线性索引向量,在原图中把相应位置的灰度值置为255饱和状态,得到图b即下图3-2。

    这样指纹提取工作基本完成,但此时的提取结果还会有部分污点没去除干净,这样通过一个imopen函数对a图即图3-1再进行一遍开运算,去除剩下的雾污染和零碎的指纹点,结果如图3-3

    将a图即图3-1与图3-3开操作的结果做差,可以得到a图即图3-1中多余的雾污染及无关点的二值图,如下图3-4所示:

    再用find函数提取这部分的索引向量在b图即图3-2中将其置为255就可以得到最后的比较理想的指纹了,如下图3-5。

源代码见链接:

https://download.csdn.net/download/qq_37764129/10384282

2010-06-17 17:15:00 theplayerwuliang 阅读数 21510
  • Tensorflow-图像处理视频教程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 课程以图像处理软件Tensorflow作为核心武器,基于图像处理热点话题进行案例实战。选择当下热门模型,使用真实数据集进行实战演示,通俗讲解整个算法模型并使用tensorflow进行实战,详解其中的原理与代码实现。

    1330 人正在学习 去看看 唐宇迪

1.图像膨胀的Matlab实现:

可以使用imdilate函数进行图像膨胀,imdilate函数需要两个基本输入参数,即待处理的输入图像和结构元素对象。结构元素对象可以是strel函数返回的对象,也可以是一个自己定义的表示结构元素邻域的二进制矩阵。此外,imdilate还可以接受两个可选参数:PADOPT(padopt) ——影响输出图片的大小、PACKOPT(packopt).——说明输入图像是否为打包的二值图像(二进制图像)。举个实例如下:

步骤1,首先创建一个包含矩形对象的二值图像矩阵。

>> BW=zeros(9,10);

>> BW(4:6,4:7) =1

BW =

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

步骤2,使用一个3×3的正方形结构元素对象对创建的图像进行膨胀。

>> SE=strel('square',3)

SE =
Flat STREL object containing 9 neighbors.

Neighborhood:
1 1 1
1 1 1
1 1 1

步骤3,将图像BW和结构元素SE传递给imdilate函数。

>> BW2=imdilate(BW,SE)

BW2 =

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

步骤4,显示结果。

>> imshow(BW,'notruesize')

>> imshow(BW2,'notruesize')

2.图像腐蚀的Matlab实现:

可以使用imerode函数进行图像腐蚀。imerode函数需要两个基本输入参数:待处理的输入图像以及结构元素对象。此外,imerode函数还可以接受3个可选参数:PADOPT(padopt) ——影响输出图片的大小、PACKOPT(packopt).——说明输入图像是否为打包的二值图像(二进制图像)。M——指定原始图像的行数。

以下程序示例说明了如何对某一副具体图像进行腐蚀操作,腐蚀前后的效果对比如图末。

步骤1,读取图像cameraman.tif (该图像是Matlab当前目录下自带的图片)

>> BW1=imread('cameraman.tif');

步骤2,创建一个任意形状的结构元素对象

>> SE=strel('arbitrary',eye(5));

步骤3,以图像BW1和结构元素SE为参数调用imerode函数进行腐蚀操作。

>> BW2=imerode(BW1,SE);

步骤4,显示操作结果

>> imshow(BW1)
>> figure,imshow(BW2)

3.膨胀和腐蚀联合操作(图像开运算操作):

下面以图像开启为例,说明如何综合使用imdilate和imerode这两个函数,实现图像处理操作。

步骤1,创建结构元素:

>> clear;close all
>> SE = strel('rectangle',[40 30]); %注意:结构元素必须具有适当的大小,既可以删电流线又可以删除矩形.

步骤2,使用结构元素腐蚀图像: %将会删除所有直线,但也会缩减矩形

>> BW1=imread('circbw.tif');
>> BW2=imerode(BW1,SE);
>> imshow(BW2)
>> figure,imshow(BW1)

步骤3,恢复矩形为原有大小,使用相同的结构元素对腐蚀过的图像进行膨胀.

>> BW3=imdilate(BW2,SE);
>> figure,imshow(BW3)

4.基于膨胀与腐蚀的形态操作——骨架化和边缘检测

(1)骨架化:

某些应用中,针对一副图像,希望对图像中所有对象简化为线条,但不修改图像的基本结构,保留图像基本轮廓,这个过程就是所谓的骨架化。提供了专门的函数bwmorph,可以实现骨架化操作。

>> clear;close all
>> BW1=imread('circbw.tif');
>> BW2=bwmorph(BW1,'skel',Inf);
>> imshow(BW1)
>> figure,imshow(BW2)

(2)边缘检测

对于一副灰度二进制图像,如果图像像素值为1,则该像素的状态为ON,如果其像素值为0,则该像素的状态为OFF。在一副图像中,如果图像某个像素满足以下两个条件:

1.该像素状态为ON,

2.该像素邻域中有一个或多个像素状态为OFF。

则认为该像素为边缘像素。

Matlab中提供了专门的函数bwperim,可以用于判断一副二进制图像中的哪些像素为边缘像素。

以下程序代码示例就是利用bwperim函数,对图像circbw.tif进行边缘检测,其边缘像素检测效果如尾图。

>> clear;close all
>> BW1=imread('circbw.tif');
>> BW2=bwperim(BW1);
>> imshow(BW1)
>> figure,imshow(BW2)

基于腐蚀和膨胀的形态操作函数如下:

bwhitmiss 图像逻辑"与"操作,该函数使用一个结构元素对图像进行腐蚀操作后,再使用第二个结构元素对图像进行腐蚀操作

imbothat 从原始图像中减去经过形态关闭后的图像,该函数可用来寻找图像中的灰度槽

imclose 闭合操作.首先对图像进行膨胀,然后再对膨胀后的图像进行腐蚀,两个操作使用同样的结构元素

imopen 开启操作,首先对图像进行腐蚀,然后再对腐蚀后的图像进行膨胀,两个操作使用同样的结构元素

imtophat 从原始图像中减去形态开启后的图像,可以用来增强图像的对比度

2014-07-01 22:15:14 Lu597203933 阅读数 2792
  • Tensorflow-图像处理视频教程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 课程以图像处理软件Tensorflow作为核心武器,基于图像处理热点话题进行案例实战。选择当下热门模型,使用真实数据集进行实战演示,通俗讲解整个算法模型并使用tensorflow进行实战,详解其中的原理与代码实现。

    1330 人正在学习 去看看 唐宇迪

这里我们主要想讲解冈萨雷斯的数字图像处理这本书上膨胀腐蚀的定义及用opencv实现的结果,然后对比它们之间的差异。

一:opencv实现

       在这之前可以看我的另外一篇blog:http://blog.csdn.net/lu597203933/article/details/17184439

膨胀:

案例代码:

int main()
{
	int a[8][8] = {
		{0,0,0,0,0,0,0,0}, 
		{0,0,5,1,0,0,1,1}, 
		{0,1,0,1,0,1,0,0},
		{0,1,1,2,1,0,1,0},
		{0,0,0,1,0,1,0,0},
		{0,1,0,0,0,0,0,1},
		{0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0}
	};
	Mat S = Mat::zeros(8, 8, CV_8UC1);
	for(int j = 0; j < S.rows; j++)
	{
		for(int i = 0; i < S.cols; i++)
		{
			S.at<uchar>(j,i) = a[j][i];
		}
	}
	cout << "S = " << endl << " " << S << endl;
	Mat result;
	Mat dilated = Mat::zeros(3, 3, CV_8UC1);
	dilated.at<uchar>(0,1) = 1;
	//eroded.at<uchar>(0,2) = 1;
	dilated.at<uchar>(1,0) = 1;
	dilated.at<uchar>(1,1) = 2;          // 结构元素非0即1
	dilated.at<uchar>(1,2) = 1;
	dilated.at<uchar>(2,1) = 1;
	cout << "dilated = " << endl << " " << dilated << endl;	
	dilate(S, result, dilated);  
	cout << "result = " << endl << " " << result << endl;
	return 0;
}

结果:


膨胀就是如果结构元B有一处非0,而A对应位置非0,则求出A中与B中对应非0处所有像素最大值来代替当前像素点值。Opencv中默认的结构元是3*3的矩阵,全部非0。

腐蚀:

案例代码:

int main()
{
	int a[8][8] = {
		{0,0,0,0,0,0,0,0}, 
		{0,0,5,1,0,0,1,1}, 
		{0,1,0,1,0,1,0,0},
		{0,1,1,2,1,0,1,0},
		{0,0,0,1,0,1,0,0},
		{0,1,0,0,0,0,0,1},
		{0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0}
	};
	Mat S = Mat::zeros(8, 8, CV_8UC1);
	for(int j = 0; j < S.rows; j++)
	{
		for(int i = 0; i < S.cols; i++)
		{
			S.at<uchar>(j,i) = a[j][i];
		}
	}
	cout << "S = " << endl << " " << S << endl;
	Mat result;
	Mat eroded = Mat::zeros(3, 3, CV_8UC1);
	eroded.at<uchar>(0,1) = 1;
	//eroded.at<uchar>(0,2) = 1;
	eroded.at<uchar>(1,0) = 1;
	eroded.at<uchar>(1,1) = 2;          // 结构元素非0即1
	eroded.at<uchar>(1,2) = 1;
	eroded.at<uchar>(2,1) = 1;
	cout << "eroded = " << endl << " " << eroded << endl;	
	erode(S, result, eroded);  
	cout << "result = " << endl << " " << result << endl;
	return 0;

结果:


腐蚀就是结构元B处非0,则A对应位置也全非0,且取全非0处最小值来代替当前像素点的值。

 

二:书中定义

膨胀: . 这里的B是结构元,B~是结构元的反射,反射不明白可以看书,就是旋转或者按中心点对称。如:

0 1   的反射就是 1 1

1 1                        1 0

与opencv中唯一的区别就是必须得求反射,而opencv中则直接用给定的结构元B。

腐蚀: 

案例:



作者:小村长  出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:http://weibo.com/2653613245/profile , 欢迎交流!)

2017-07-28 10:35:00 llh_1178 阅读数 5949
  • Tensorflow-图像处理视频教程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 课程以图像处理软件Tensorflow作为核心武器,基于图像处理热点话题进行案例实战。选择当下热门模型,使用真实数据集进行实战演示,通俗讲解整个算法模型并使用tensorflow进行实战,详解其中的原理与代码实现。

    1330 人正在学习 去看看 唐宇迪

提取图像中的水平线和垂直线,是对图像的处理非常有好处的,能够筛选出对自己有用的、感兴趣的部分。比如从富有干扰杂质的验证码中提取干净的验证码。

从这样:  变成这样:

就可以轻松看出验证码了。当然,这只是其中的一个小例子,还有很多实例等着去开发。

下面回到我们的主题,提取水平线和垂直线,我们首先要将图像灰度化,然后再二值化,最后进行形态学的操作(腐蚀和膨胀),达到提取水平和垂直线的要求。下面分别用Python和C++实现这个过程。

先用python实现:

#! /usr/bin/env python
# -*- coding:utf-8 -*-
import cv2
src = cv2.imread("bin1.png")
gray_src = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
cv2.imshow("input image", src)
cv2.imshow("gray image", gray_src)
gray_src = cv2.bitwise_not(gray_src)
binary_src = cv2.adaptiveThreshold(gray_src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 15, -2)
cv2.namedWindow("result image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("result image", binary_src)
# 提取水平线
hline = cv2.getStructuringElement(cv2.MORPH_RECT, ((src.shape[1] / 16), 1), (-1, -1))
# 提取垂直线
vline = cv2.getStructuringElement(cv2.MORPH_RECT, (1, (src.shape[0] / 16)), (-1, -1))
# 这两步就是形态学的开操作——先腐蚀再膨胀
# temp = cv2.erode(binary_src, hline)
# dst = cv2.dilate(temp, hline)
dst = cv2.morphologyEx(binary_src, cv2.MORPH_OPEN, vline)
dst = cv2.bitwise_not(dst)
cv2.imshow("Final image", dst)
cv2.waitKey(0)

图像展示(垂直线):


图像展示(水平线):



可以看出完全的分别提取出了水平线和垂直线。


通过C++实现也能达到同样的效果,图这里就不显示了:

# include <opencv2/opencv.hpp>
# include <iostream>


using namespace cv;
int main(int argc, char* argv) {
	Mat src, dst;
	src = imread("C:/Users/12914/Pictures/char1.png");
	if (src.empty()) {
		printf("Could not load image...\n");
		return -1;
	}
	char INPUT_WIN[] = "input image";
	char OUTPUT_WIN[] = "result image";
	namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
	imshow(INPUT_WIN, src);
	// 变成灰度图像
	Mat gray_src;
	cvtColor(src, gray_src, CV_BGR2GRAY);
	imshow("gray_src", gray_src);

	//变成二值图像
	Mat binImg;
	adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
	imshow("binary image", binImg);

	//水平结构元素
	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
	//垂直结构元素
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
	

	// 形态学开操作——先腐蚀后膨胀
	Mat temp;
	//erode(binImg, temp, hline);
	//dilate(temp, dst, hline);
	morphologyEx(binImg, dst, CV_MOP_OPEN, hline);
	bitwise_not(dst, dst);
	//blur(dst, dst, Size(3, 3), Point(-1, -1));
	imshow("Final Result", dst);
	imwrite("C:/Users/12914/Pictures/char1_change.png", dst);
	waitKey(0);
	return 0;
}



2018-01-02 09:10:23 zhougynui 阅读数 225
  • Tensorflow-图像处理视频教程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 课程以图像处理软件Tensorflow作为核心武器,基于图像处理热点话题进行案例实战。选择当下热门模型,使用真实数据集进行实战演示,通俗讲解整个算法模型并使用tensorflow进行实战,详解其中的原理与代码实现。

    1330 人正在学习 去看看 唐宇迪

图像分割原理视频教程—709人已学习
课程介绍    
201712302210445907.
    图像分割原理视频课程内容涵盖: 1.分析图像处理中“相关”和“卷积”的原理学习培训,基于卷积的原理讲解各种滤波器的原理并提供案例代码。 2.剖析形态学处理中膨胀、腐蚀、开闭运算、帽运算的原理,并给出案例代码。 3.分类讲解图像分割方法的原理:基于阈值的分割、基于区域的分割(风水岭)、基于图论的分割(graph cut)、基于边缘提取的分割。
课程收益
    1.掌握卷积的原理和各种滤波器。
    2.掌握形态学处理常用的方法。
    3.理解图像分割的原理,搭建图像分割知识框架,了解基于图论的分割方法,掌握剩下三种分割方法。重点掌握边缘提取中的一阶和二阶微分算子。
讲师介绍
    周玉飞更多讲师课程
    北京信息科技大学计算机硕士毕业,现就职于某生物科技有限,从事嵌医学图像处理工作。
课程大纲
    1.卷积和相关的数学理解  9:52
    2.图像滤波原理及计算方法  15:49
    3.初识各类滤波器  40:23
    4.形态学腐蚀膨胀操作原理及案例代码  17:36
    5.开闭、梯度及帽操作原理及代码  10:02
    6.图像分割概述  13:12
    7.基于阈值分割的原理及案例代码  14:46
    8.分水岭分割算法原理剖析  23:44
    9.边缘提取原理及常用算子概要  14:49
    10.sobel Roberts Prewitt canny算子原理及案例代码  34:29
    11.laplace二阶算子原理及案例代码  17:58
    12.基于图论分割原理分析  30:30
大家可以点击【查看详情】查看我的课程

形态学图像处理(二)

阅读数 10829

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