b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

直接可以用的Python和OpenCV检测及分割图像的目标区域例子

电脑杂谈  发布时间:2019-07-31 03:06:36  来源:网络整理

图像算法 分割_python 图像区域分割_matlab 分割图像

老师:你知道么,今天有人问了我一个问题。

~.我:什么?

老师:他说很难。

~.我:关于什么的?

老师:图像处理。

~.我:喔,你说说看,我确实做了不少图像处理的东西(心里默念,你不知知道你给过我多少图像吗?)

老师:好嘞!在用深度学习的时候,比如说面对一张图像,对某个区域感兴趣怎么办?

~.我:他傻啊,切割出来啊,只需要训练感兴趣的部分就好啦。

老师:哎python 图像区域分割,那你给我一个教程,我正好顺手把他的问题解决了。

~.我:好的(黑人脸.gif)

老师:我回头把图片数据发给你。

~.我:好的好的,老师,by the way, 有多少数据啊?

老师:也不多,一个U盘够了,这样吧,明天你过来拷一下吧。

~.我:好的(hello?一个U盘?)

这里写图片描述

这里写图片描述

有这么一个文件

matlab 分割图像_python 图像区域分割_图像算法 分割

看了里面。。。我要爆炸了。。。

这里写图片描述

> 598M * 15 = 8970M = 8.97G 我的个妈呀。

打开一看 全是密密麻麻的——虫子!!!

为了视觉体验,自动屏蔽,请大家自行去谷歌:虫子、worm、bug、insects。。。

~.我: 老师, 我就给一个方法啊, 不同的虫子他们可以自己调阈值和方法,我已经有写说明文件。

老师: 好的,我看看。

考虑到视觉忍受能力,我用一个可爱的虫子做为一个示例,其他的都差不多,大家自行尝试。

目标是把虫子区域抠出来

这里写图片描述

环境:

例图:谷歌,可爱的虫子–image

软件:Anaconda 4.20,Opencv3.2

OpenCv的安装:

1.1安装Python3.60

1.2下载安装opencv3.2

1.获取图片,这个简单哈

图像算法 分割_matlab 分割图像_python 图像区域分割

img_path = r'C:\Users\aixin\Desktop\chongzi.png'
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

看,这不就是你处理初始的样子?

2.转换灰度并去噪声

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (9, 9),0) 

指纹图像预处理采用了gabor 滤波的方法进行灰度图滤波去噪,通过将图像滤波后,对其进行二值化处理使各种噪声得到滤除或者修正。对添加高斯噪声的图片进行处理,滤波模板为5*5,效果如下.高斯滤波效果较好。作者也尝试了在使用微分模板前加入 一个高斯平滑滤波,但是这个高斯平滑滤波的加入使得检测效果更差,原因是:许多有用的图像信息是来自变化剧烈的边缘,而在计算梯度之前加入高斯滤波会把这 些边缘滤除掉。

这里取高斯是因为高斯去噪效果是最好的。

这里写图片描述

3.提取图像的梯度

gradX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0)
gradY = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1)
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)

以Sobel算子计算x,y方向上的梯度,之后在x方向上减去y方向上的梯度,通过这个减法,我们留下具有高水平梯度和低垂直梯度的图像区域。

此时,我们会得到

这里写图片描述

4.我们继续去噪声

考虑到图像的孔隙 首先使用低通滤泼器平滑图像, 这将有助于平滑图像中的高频噪声。 低通滤波器的目标是降低图像的变化率。

如将每个像素替换为该像素周围像素的均值, 这样就可以平滑并替代那些强度变化明显的区域。

对模糊图像二值化,顾名思义,就是把图像数值以某一边界分成两种数值,细节我会附在文章底部,如果还是不懂,去cao文档吧。

blurred = cv2.GaussianBlur(gradient, (9, 9),0)
(_, thresh) = cv2.threshold(blurred, 90, 255, cv2.THRESH_BINARY)

图像算法 分割_python 图像区域分割_matlab 分割图像

此时,我们会得到

这里写图片描述

图像的轮廓特征主要针对物体的外边界,而图像的区域特征则关系到整个形状区域。此属性将会绘制与所谓的突变边界地区内部,这个边界默认区域为borderbox,就像属性border-image-slice,属性border-image-width规定了内部被划分为九个区域。另外关于【影像主视窗界面】,还有三个问题可以说明下,第一问题就是关于分割边界的颜色,如果当前视图显示的是原始影像,那么默认分割边界是蓝色的,如果当前视图显示的是分类结果,那么未分类对象的分割边界是黑色的,已分类对象的分割边界是类别对应的颜色。

5.图像形态学(牛逼吧、唬人的)

在这里我们选取ELLIPSE核python 图像区域分割,采用CLOSE操作,具体细节你依旧可以参考我的附录文档,及拓展。

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

此时,我们会得到

这里写图片描述

6.细节刻画

从上图我们可以发现和原图对比,发现有细节丢失,这会干扰之后的昆虫轮廓的检测,要把它们扩充,分别执行4次形态学腐蚀与膨胀(附录文档)

closed = cv2.erode(closed, None, iterations=4)
closed = cv2.dilate(closed, None, iterations=4)

此时,我们会得到

这里写图片描述

7.找出昆虫区域的轮廓

此时用cv2.findContours()函数

第一个参数是要检索的图片,必须是为二值图,即黑白的(不是灰度图)

(_, cnts, _) = cv2.findContours(
    参数一: 二值化图像
    closed.copy(),
    参数二:轮廓类型
    # cv2.RETR_EXTERNAL,             #表示只检测外轮廓
    # cv2.RETR_CCOMP,                #建立两个等级的轮廓,上一层是边界
    # cv2.RETR_LIST,                 #检测的轮廓不建立等级关系
    # cv2.RETR_TREE,                 #建立一个等级树结构的轮廓
    # cv2.CHAIN_APPROX_NONE,         #存储所有的轮廓点,相邻的两个点的像素位置差不超过1
    参数三:处理近似方法
    # cv2.CHAIN_APPROX_SIMPLE,         #例如一个矩形轮廓只需4个点来保存轮廓信息
    # cv2.CHAIN_APPROX_TC89_L1,
    # cv2.CHAIN_APPROX_TC89_KCOS
    )

matlab 分割图像_图像算法 分割_python 图像区域分割

8.画出轮廓

找到轮廓了,接下来,要画出来的,即用cv2.drawContours()函数。

c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
# compute the rotated bounding box of the largest contour
rect = cv2.minAreaRect(c)
box = np.int0(cv2.boxPoints(rect))
# draw a bounding box arounded the detected barcode and display the image
draw_img = cv2.drawContours(img.copy(), [box], -1, (0, 0, 255), 3)
cv2.imshow("draw_img", draw_img)

此时,我们会得到

这里写图片描述

9.裁剪出来就完成啦

方法嘛,这不就是么,找到这四个点切出来就好啦

我们放大一点看一下细节

这里写图片描述+

Xs = [i[0] for i in box]
Ys = [i[1] for i in box]
x1 = min(Xs)
x2 = max(Xs)
y1 = min(Ys)
y2 = max(Ys)
hight = y2 - y1
width = x2 - x1
crop_img= img[y1:y1+hight, x1:x1+width]
cv2.imshow('crop_img', crop_img)

其实,box里保存的是绿色矩形区域四个顶点的坐标。 我将按下图红色矩形所示裁剪昆虫图像。

找出四个顶点的x,y坐标的最大最小值。新图像的高=maxY-minY,宽=maxX-minX

这里写图片描述

终于我们得到了可爱的小虫子。

得到了目标区域,那么你想拿它干什么就干什么!我不管你哈。

考虑到现在的python教程一般都是一上来就是list、tuple什么的,而不是文件的读写和保存,包括批量读取等等,我特地加入了python版的文件批量读写和保存等附录文件。

快快快、夸我!


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-117088-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 相马茜
        相马茜

        中国海军跟日本是无法比的

      每日福利
      热点图片
      拼命载入中...