精华内容
下载资源
问答
  • 图像分割—基于区域图像分割

    万次阅读 多人点赞 2019-08-17 10:40:40
    基于区域分割是以直接寻找区域为基础的分割技术,实际上类似基于边界的图像分割技术一样利用了对象与背景灰度分布的相似性。大体上基于区域图像分割方法可以分为两大类:区域生长法区域分裂与合并1 区域生长法...

    0 区域分割技术

    基于区域的分割是以直接寻找区域为基础的分割技术,实际上类似基于边界的图像分割技术一样利用了对象与背景灰度分布的相似性。

    大体上基于区域的图像分割方法可以分为两大类:

    1. 区域生长法
    2. 区域分裂与合并

    1 区域生长法

    根据一定的准则将像素或子区域聚合城更大区域的过程。区域生长法的关键在于选取合适的生长准则,不同的生长准则会影响区域生长的过程、结果。生长准则可根据不同的原则制定,大部分区域生长准则使用图像的局部性质。

    1.1 基本方法

    以一组种子点开始,将与种子性质相似(如灰度级)的领域像素附加到生长区域的每个种子上

    1.1.1 种子产生的方法

    • 根据所解决问题的性质选择一个或多个起点
    • 若无先验信息,则对每个像素计算相同的特性集,特性集在生长过程中用于将像素归属于某个区域
    • 若这些计算的结果呈现了不同簇的值,则簇中心附近的像素可以作为种子

    1.1.2 终止规则
    若没有像素满足加入到某个区域的条件时,则区域停止生长,终止规则的制定需要先验知识或先验模型。

    1.1.3 相似度准则

    • 灰度级类似准则
    • 纹理类似准则
    • 颜色类似准则
    1.2 区域生长法算法

    1.2.1 基于区域灰度差的区域生长法
    这是一种以像素为基本单位进行操作的方法,具体步骤如下:

    1. 对图像进行逐行扫描,找出尚没有归属的图像
    2. 以该像素为中心检查它的领域像素,即将领域中的像素逐个与它比较,若灰度差小于阈值TT,则将它们合并
    3. 以新合并的像素为中心,回到步骤2检查新像素的邻域,直到区域无法进一步扩张
    4. 重复步骤1~3,直到不能找出没有归属的像素则结束整个生长过程

    一个4领域、阈值T=1T=1的区域生长示例:
    在这里插入图片描述

    改进方法的思路

    • 求出所有领域的平均灰度差,并合并具有最小灰度差的邻接区域
    • 考虑区域生长的历程
    • 考虑生长形状

    1.2.2 基于区域内灰度分布统计的区域生长法
    考虑以灰度分布相似性作为生长准则来决定区域的合并,具体步骤如下:

    1. 把图像划分为互不重叠的小区域
    2. 比较邻接区域的灰度直方图,根据灰度分布的相似性进行区域合并
    3. 设定终止准则,通过不断重复步骤2将各个区域依次合并,直到满足终止准则

    h1(z)h_1(z)h2(z)h_2(z)分别为两个邻接区域的灰度直方图,则灰度分布相似性判断标准为:max h1(z)h2(z) \max|\ h_1(z)-h_2(z)\ | h1(z)h2(z) \sum|\ h_1(z)-h_2(z)\ |若检测结果小于给定阈值TT,即将两个区域合并
    需要注意的是,划分区域的大小要合适,太小则可靠性降低,太大则测得的区域形状不理想

    2 区域分裂与合并

    区域分裂与合并算法的基本思路类似于微分,即无穷分割,然后将分割后满足相似度准则的区域进行合并。

    2.1 实现步骤
    1. 对图像中灰度级不同的区域,均分为4个子区域
    2. 若相邻的子区域所有像素的灰度级相同,则将其合并
    3. 重复1~2步骤,直到不再有新的分裂与合并为止

    2.1.1 改进方法
    将相似度准则P(Ri)P(R_i)定义为:

    1. 区域内多于80%的像素满足不等式P(Ri)= zijmi 2σiP(R_i)=|\ z_{ij}-m_i\ |\leqslant 2\sigma_i其中zijz_{ij}表示区域RijR_{ij}中第jj个点的灰度级;mim_i表示区域RiR_i的平均灰度级;σi\sigma_i表示区域RiR_i灰度级的标准方差
    2. P(Ri)2σiP(R_i)\leqslant 2\sigma_i,则将区域内所有像素的灰度级置为mim_i
    展开全文
  • matlab区域增长法分割图像例子

    万次阅读 2015-11-01 12:48:17
    其优点是基本思想相对简单,通常能将具有相同特征的联通区域分割出来,并能提供很好的边界信息和分割结果。在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图象,如自然景物。 但是,区域...
    1.区域生长是一种串行区域分割的图像分割方法
    

    优点是基本思想相对简单,通常能将具有相同特征的联通区域分割出来,并能提供很好的边界信息和分割结果。在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图象,如自然景物。

    但是,区域生长法是一种迭代的方法,空间和时间开销都比较大噪声和灰度不均一可能会导致空洞和过分割,并在对图像中的阴影效果处理上往往不是很好。

    2.区域生长的基本思想是:

    将具有相似性质的像素集合起来构成区域。

    • 先对每个需要分割的区域找一个种子像素作为生长的起点
    • 然后将种子像素周围邻域中与种子像素具有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中
    • 将这些新像素当做新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来,这样,一个区域就长成了。

    3.区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于

    • 初始点(种子点)的选取。
    • 生长准则。
    • 终止条件。

    区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。

    4.简单来说下三个法则,对出需要分割的图像:

    1. 选取图像中的一点为种子点(种子点的选取需要具体情况具体分析)。
    2. 在种子点处进行8邻域或4邻域扩展,判定准则是:如果考虑的像素与种子像素灰度值差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。
    3. 当不再有像素满足加入这个区域的准则时,区域生长停止。

    区域生长实现的步骤如下:

    1. 对图像顺序扫描!找到第1个还没有归属的像素, 设该像素为(x0, y0);

    2.  以(x0, y0)为中心, 考虑(x0, y0)的8邻域像素(x, y),如果(x,, y)满足生长准则, 将(x, y)与(x0, y0)合并(在同一区域内), 同时将(x, y)压入堆栈;

    3.  从堆栈中取出一个像素, 把它当作(x0, y0)返回到步骤2;

    4.  当堆栈为空时!返回到步骤1;

    5. 重复步骤1 - 4直到图像中的每个点都有归属时。生长结束。

    matlab例子(来源于matlab中文论坛:http://www.ilovematlab.cn/thread-75607-1-1.html):

    A0=imread('圆圈.jpg');%读取图像
    seed=[1,2];%选择起始位置
    thresh=15;%相似性选择阈值
    A=rgb2gray(A0);%灰度化
    A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);
    A=double(A);%将图像灰度化
    B=A;
    [r,c]=size(B);%r为行数,c为列
    n=r*c;%计算图像包含点的个数
    pixel_seed=A(seed(1),seed(2));%原图起始点灰度值
    q=[seed(1),seed(2)];%q用来装载起始位置
    top=1;%循环判断flag
    M=zeros(r,c);%建立一个与原图大小一样的矩阵
    M(seed(1),seed(2))=1;%将起始点赋为1,其余为0
    count=1;%计数器
    
    while top~=0 %循环结束条件
        r1=q(1,1);%起始点行位置
        c1=q(1,2);%起始点列位置
        p=A(r1,c1);%起始点灰度值
        dge=0;
        for i=-1:1%周围点循环判断
            for j=-1:1
                
                if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0%保证在点周围范围内
                    if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1
                        top=top+1;%满足判定条件则top+1,top为多少,则q的行数有多少
                        q(top,:)=[r1+i,c1+j];%将满足判定条件的周围点位置赋予q,q记载了满足判定的每一外点
                        M(r1+i,c1+j)=1;%满足判定条件将M中相对应的点赋1
                        count=count+1;%统计满足条件的点个数,其实与top此时的值一样
                        B(r1+i,c1+j)=1;%满足判定条件将B中相对应点赋值1
                    end
                    
                    if M(r1+i,c1+j)==0;%如果M中相对应的值为0,将dge赋值为1,也就是说这几个点不满足条件
                        dge=1;
                    end
                    
                else
                    dge=1;%在图像外将dge赋值为1
                end
            end
        end
        %此时对周围几点判断完毕,在点在图像外或不满足判定条件则将dge赋为1,满足条件dge为0
        if dge~=1
            B(r1,c1)=A(seed(1),seed(2));%将原图起始位置赋予B
        end
        
        if count>=n%如果满足判定条件的点个数大于等于n
            top=1;
        end
        
        q=q(2:top,:);
        top=top-1;
    end
    subplot(121),imshow(A,[]);
    subplot(122),imshow(B,[]);
    










    展开全文
  • 第一天老师:你知道么,今天有人问了我一个...在用深度学习的时候,比如说面对一张图像,对某个区域感兴趣怎么办? ~.我:他傻啊,切割出来啊,只需要训练感兴趣的部分就好啦。老师:哎,那你给我一个教程,我正好顺手

    第一天

    老师:你知道么,今天有人问了我一个问题。
    ~.我:什么?
    老师:他说很难。
    ~.我:关于什么的?
    老师:图像处理。

    ~.我:喔,你说说看,我确实做了不少图像处理的东西(心里默念,你不知知道你给过我多少图像吗?)
    老师:好嘞!在用深度学习的时候,比如说面对一张图像,对某个区域感兴趣怎么办?
    ~.我:他傻啊,切割出来啊,只需要训练感兴趣的部分就好啦。

    老师:哎,那你给我一个教程,我正好顺手把他的问题解决了。
    ~.我:好的(黑人脸.gif)
    老师:我回头把图片数据发给你。
    ~.我:好的好的,老师,by the way, 有多少数据啊?
    老师:也不多,一个U盘够了,这样吧,明天你过来拷一下吧。
    ~.我:好的(hello?一个U盘?)

    这里写图片描述

    第二天

    这里写图片描述


    有这么一个文件
    看了里面。。。我要爆炸了。。。
    这里写图片描述

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

    打开一看 全是密密麻麻的------虫子!!!
    为了视觉体验,自动屏蔽,请大家自行去谷歌:虫子、worm、bug、insects。。。

    三天后

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

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

    目标是把虫子区域抠出来

    这里写图片描述


    环境:

    例图:谷歌,可爱的虫子–image
    软件:Anaconda 4.20,Opencv3.2
    OpenCv的安装:
    1.1安装Python3.60
    1.2下载安装opencv3.2


    具体思路如下:

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

    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) 
    

    我们可以得到这两张图,第一张是灰度图,第二张是去噪之后的,另外说一下,去噪咱们有很多种方法,均值滤波器、高斯滤波器、中值滤波器、双边滤波器等。

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

    这里写图片描述

    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)
    

    此时,我们会得到
    这里写图片描述

    其实就算手动分割我们也是需要找到一个边界吧,可以看到轮廓出来了,但是我们最终要的是整个轮廓,所以内部小区域就不要了

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

    在这里我们选取ELLIPSE核,采用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
        )
    

    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)
    
    # 优化代码---from [刘元振](https://me.csdn.net/yuanzhen_0128)
    x1 = abs(min(xs)) 
    x2 = abs(max(xs)) 
    y1 = abs(min(ys)) 
    y2 = abs(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版的文件批量读写和保存等附录文件。

    快快快、夸我!

    附录1.实现代码

    #-*- coding: UTF-8 -*- 
    
    '''
    Author: Steve Wang
    Time: 2017/12/8 10:00
    Environment: Python 3.6.2 |Anaconda 4.3.30 custom (64-bit) Opencv 3.3
    '''
    
    import cv2
    import numpy as np
    
    
    def get_image(path):
        #获取图片
        img=cv2.imread(path)
        gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        
        return img, gray
        
    def Gaussian_Blur(gray):
        # 高斯去噪
        blurred = cv2.GaussianBlur(gray, (9, 9),0)
        
        return blurred
        
    def Sobel_gradient(blurred):
        # 索比尔算子来计算x、y方向梯度
        gradX = cv2.Sobel(blurred, ddepth=cv2.CV_32F, dx=1, dy=0)
        gradY = cv2.Sobel(blurred, ddepth=cv2.CV_32F, dx=0, dy=1)
        
        gradient = cv2.subtract(gradX, gradY)
        gradient = cv2.convertScaleAbs(gradient)
        
        return gradX, gradY, gradient
    
    def Thresh_and_blur(gradient):
        
        blurred = cv2.GaussianBlur(gradient, (9, 9),0)
        (_, thresh) = cv2.threshold(blurred, 90, 255, cv2.THRESH_BINARY)
        
        return thresh
        
    def image_morphology(thresh):
        # 建立一个椭圆核函数
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25))
        # 执行图像形态学, 细节直接查文档,很简单
        closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
        closed = cv2.erode(closed, None, iterations=4)
        closed = cv2.dilate(closed, None, iterations=4)
        
        return closed
        
    def findcnts_and_box_point(closed):
        # 这里opencv3返回的是三个参数
        (_, cnts, _) = cv2.findContours(closed.copy(), 
            cv2.RETR_LIST, 
            cv2.CHAIN_APPROX_SIMPLE)
        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))
        
        return box
    
    def drawcnts_and_cut(original_img, box):
        # 因为这个函数有极强的破坏性,所有需要在img.copy()上画
        # draw a bounding box arounded the detected barcode and display the image
        draw_img = cv2.drawContours(original_img.copy(), [box], -1, (0, 0, 255), 3)
        
        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 = original_img[y1:y1+hight, x1:x1+width]
        
        return draw_img, crop_img
        
    def walk():
        
        img_path = r'C:\Users\aixin\Desktop\chongzi.png'
        save_path = r'C:\Users\aixin\Desktop\chongzi_save.png'
        original_img, gray = get_image(img_path)
        blurred = Gaussian_Blur(gray)
        gradX, gradY, gradient = Sobel_gradient(blurred)
        thresh = Thresh_and_blur(gradient)
        closed = image_morphology(thresh)
        box = findcnts_and_box_point(closed)
        draw_img, crop_img = drawcnts_and_cut(original_img,box)
        
        # 暴力一点,把它们都显示出来看看
        
        cv2.imshow('original_img', original_img)
        cv2.imshow('blurred', blurred)
        cv2.imshow('gradX', gradX)
        cv2.imshow('gradY', gradY)
        cv2.imshow('final', gradient)
        cv2.imshow('thresh', thresh)
        cv2.imshow('closed', closed)
        cv2.imshow('draw_img', draw_img)
        cv2.imshow('crop_img', crop_img)
        cv2.waitKey(20171219)
        cv2.imwrite(save_path, crop_img)
    
    walk()
    

    附录2.本篇文章精华函数说明

    
    # 用来转化图像格式的
    img = cv2.cvtColor(src, 
        COLOR_BGR2HSV # BGR---->HSV
        COLOR_HSV2BGR # HSV---->BGR
        ...)
    # For HSV, Hue range is [0,179], Saturation range is [0,255] and Value range is [0,255]
    
    
    # 返回一个阈值,和二值化图像,第一个阈值是用来otsu方法时候用的
    # 不过现在不用了,因为可以通过mahotas直接实现
    T = ret = mahotas.threshold(blurred)
    ret, thresh_img = cv2.threshold(src, # 一般是灰度图像
        num1, # 图像阈值
        num2, # 如果大于或者num1, 像素值将会变成 num2
    # 最后一个二值化参数
        cv2.THRESH_BINARY      # 将大于阈值的灰度值设为最大灰度值,小于阈值的值设为0
        cv2.THRESH_BINARY_INV  # 将大于阈值的灰度值设为0,大于阈值的值设为最大灰度值
        cv2.THRESH_TRUNC       # 将大于阈值的灰度值设为阈值,小于阈值的值保持不变
        cv2.THRESH_TOZERO      # 将小于阈值的灰度值设为0,大于阈值的值保持不变
        cv2.THRESH_TOZERO_INV  # 将大于阈值的灰度值设为0,小于阈值的值保持不变
    )
    thresh = cv2.AdaptiveThreshold(src, 
        dst, 
        maxValue, 
        # adaptive_method 
        ADAPTIVE_THRESH_MEAN_C,      
        ADAPTIVE_THRESH_GAUSSIAN_C,      
        # thresholdType
        THRESH_BINARY, 
        THRESH_BINARY_INV, 
        blockSize=3,
        param1=5
    )
    
    
    # 一般是在黑色背景中找白色物体,所以原始图像背景最好是黑色
    # 在执行找边缘的时候,一般是threshold 或者是canny 边缘检测后进行的。
    # warning:此函数会修改原始图像、
    # 返回:坐标位置(x,y), 
    (_, cnts, _) = cv2.findContours(mask.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
       )
    img = cv2.drawContours(src, cnts, whichToDraw(-1), color, line)
    
    
    img = cv2.imwrite(filename, dst,  # 文件路径,和目标图像文件矩阵
        
        # 对于JPEG,其表示的是图像的质量,用0-100的整数表示,默认为95
        # 注意,cv2.IMWRITE_JPEG_QUALITY类型为Long,必须转换成int
        [int(cv2.IMWRITE_JPEG_QUALITY), 5] 
        [int(cv2.IMWRITE_JPEG_QUALITY), 95]
        # 从0到9,压缩级别越高,图像尺寸越小。默认级别为3
        [int(cv2.IMWRITE_PNG_COMPRESSION), 5])
        [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
    
    # 如果你不知道用哪个flags,毕竟太多了哪能全记住,直接找找。
    寻找某个函数或者变量
    events = [i for i in dir(cv2) if 'PNG' in i]
    print( events )
    
    寻找某个变量开头的flags
    flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
    print flags
    
    批量读取文件名字
    import os
    filename_rgb = r'C:\Users\aixin\Desktop\all_my_learning\colony\20170629'
    for filename in os.listdir(filename_rgb):              #listdir的参数是文件夹的路径
        print (filename)
    

    转载和疑问声明

    如果你有什么疑问或者想要转载,没有允许是不能转载的哈
    赞赏一下能不能转?哈哈,联系我啊,我告诉你呢 ~~
    欢迎联系我哈,我会给大家慢慢解答啦~~~怎么联系我? 笨啊~ ~~ 你留言也行

    你关注微信公众号1.机器学习算法工程师:2.或者扫那个二维码,后台发送 “我要找朕”,联系我也行啦!

    %E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AE%97%E6%B3%95%E5%B7%A5%E7%A8%8B%E5%B8%88.jpg

    (爱心.gif) 么么哒 ~么么哒 ~么么哒
    码字不易啊啊啊,如果你觉得本文有帮助,三毛也是爱!

    我祝各位帅哥,和美女,你们永远十八岁,嗨嘿嘿~~~

    wei.jpgali.jpg
    展开全文
  • Opencv 图像分割: 阈值化分割 区域分割 边缘分割 卷积 就是两个函数之间的相互关系,然后得出一个新的值,在连续空间做积分计算,然后在离散空间内求和的过程。 在计算机视觉里面,可以把卷积当做一个抽象的过程...

    Opencv 图像分割: 阈值化分割 区域分割 边缘分割

    卷积
    就是两个函数之间的相互关系,然后得出一个新的值,在连续空间做积分计算,然后在离散空间内求和的过程。
    在计算机视觉里面,可以把卷积当做一个抽象的过程,就是把小区域内的信息统计抽象出来

    图像阈值化分割
    按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,
    各个区域内部具有一致的属性,而相邻区域不具有这种一致属性。
    它是一种传统的最常用的图像分割方法,因计算简单、运算效率较高、速度快、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。
    它特别适用于目标和背景占据不同灰度级范围的图像,在极大的压缩数据量的同时也大大简化了分析和处理步骤,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。
    它有全局阈值、自适应阈值、最佳阈值等

    二值化cvThreshold

    /* Applies fixed-level threshold to grayscale image.
       This is a basic operation applied before retrieving contours */
    CVAPI(double)  cvThreshold( const CvArr*  src, CvArr*  dst,
                                double  threshold, double  max_value,
                                int threshold_type );

    src输入图像,须为单通道灰度图。
    dst输出的边缘图像,为单通道黑白图。
    threshold表示阈值
    max_value表示最大值。
    threshold_type表示二值化类型(即对图像取阈值的方法)

    /* Threshold types */
    enum
    {
        CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */
        //if src(x,y)>threshold dst(x,y) = max_value, 
        //otherwise  dst(x,y) = 0,
    
        CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */
        //if src(x,y)>threshold dst(x,y) = 0, 
        //otherwise  dst(x,y) = max_value,
    
        CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */
        //if src(x,y)>threshold dst(x,y) = threshold, 
        //otherwise  dst(x,y) = src(x,y),
    
        CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */
         //if src(x,y)>threshold dst(x,y) = src(x,y), 
        //otherwise  dst(x,y) = 0,
    
        CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */
         //if src(x,y)>threshold dst(x,y) = 0, 
        //otherwise  dst(x,y) = src(x,y),
    
        CV_THRESH_MASK        =7,
        CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value;
                                     combine the flag with one of the above CV_THRESH_* values */
        //threshold_type使用CV_THRESH_OTSU,则cvThreshold()将使用大律法OTSU得到的全局自适应阈值来进行二值化图像,而参数中的threshold不再起作用
    };
    如:cvThreshold(grayImg, binaryImg, 145, 255, CV_THRESH_BINARY); //二值图

    自适应二值化cvAdaptiveThreshold
    函数使用Otsu算法(大律法或最大类间方差法)来计算出一个全局阈值,然后根据这个阈值进行二值化
    Otsu实现思路
    1、计算0~255各灰阶对应的像素个数,保存至一个数组中,该数组下标是灰度值,保存内容是当前灰度值对应像素数
    2、计算背景图像的平均灰度、背景图像像素数所占比例
    3、计算前景图像的平均灰度、前景图像像素数所占比例
    4、遍历0~255各灰阶,计算并寻找类间方差极大值,此时对应的阈值就是大津法(OTSU算法)所求的阈值

    /* Applies adaptive threshold to grayscale image.
       The two parameters for methods CV_ADAPTIVE_THRESH_MEAN_C and
       CV_ADAPTIVE_THRESH_GAUSSIAN_C are:
       neighborhood size (3, 5, 7 etc.),
    */
    
    CVAPI(void)  cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value,
                                      int adaptive_method CV_DEFAULT(CV_ADAPTIVE_THRESH_MEAN_C),
                                      int threshold_type CV_DEFAULT(CV_THRESH_BINARY),
                                      int block_size CV_DEFAULT(3),
                                      double param1 CV_DEFAULT(5));

    src输入图像
    dst输出图像
    max_value表示最大值
    adaptive_method
    自适应阈值算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C .
    threshold_type
    阈值类型:必须是CV_THRESH_BINARY或者CV_THRESH_BINARY_INV.
    block_size
    用来计算阈值的象素邻域大小: 3, 5, 7, …,block_size比较小的时候,相当于提取边缘
    param1
    与方法有关的参数,它是一个从均值或加权均值提取的常数,它可以是负数。
    对方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1。
    对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian),再减掉param1。

    区域分割
    图像按照相似性准则分成不同的区域,主要包括区域增长,区域分裂合并和分水岭等几种类型

    边缘分割
    通过边缘检测,即检测灰度级或者结构具有突变的地方,表明一个区域的终结,也是另一个区域开始的地方。
    这种不连续性称为边缘。不同的图像灰度不同,边界处一般有明显的边缘,利用此特征可以分割图像

    图像中边缘处像素的灰度值不连续,这种不连续性可通过求导数来检测到。
    对于阶跃状边缘,其位置对应一阶导数的极值点,对应二阶导数的过零点(零交叉点)。
    因此常用微分算子进行边缘检测。常用的:
    一阶微分算子有Roberts算子、Prewitt算子和Sobel算子、LoG算子,
    二阶微分算子有Laplace算子和Kirsh算子、Canny算子等。
    在实际中各种微分算子常用小区域模板来表示,微分运算是利用模板和图像卷积来实现。这些算子对噪声敏感,只适合于噪声较小不太复杂的图像。

    由于边缘和噪声都是灰度不连续点,在频域均为高频分量,直接采用微分运算难以克服噪声的影响。因此用微分算子检测边缘前要对图像进行平滑滤波。LoG算子和Canny算子是具有平滑功能的二阶和一阶微分算子,边缘检测效果较好

    边缘检测算法:
    滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能.
    增强:将邻域(或局部)强度值有显著变化的点突显出来.边缘增强一般是通过计算梯度幅值来完成的.
    检测:确定边缘,最简单的边缘检测判据是梯度幅值阈值判据.
    定位:边缘的位置、方位可在子像素分辨率上估计出来.

    CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
                             double threshold1, double threshold2,
                             int apertureSize=3, bool L2gradient=false );

    1、高斯平滑滤波器卷积降噪,默然采用size = 5的高斯内核
    2、运用一对卷积阵列 (分别作用于x和y方向)求导,Sobel内核大小3 X 3,计算梯度幅值和方向
    3、根据阀值、梯度幅值得出边缘

    Canny边缘检测算法
    一个多级边缘检测算法,普遍认为是边缘检测的最优算法,Canny使用滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值)
    Canny使用两种不同的阈值分别检测强边缘和弱边缘,并且仅当弱边缘和强边缘相连时,才将边缘包含在输出图像中。因此不容易被噪声“填充”,更容易检测出真正的弱边缘

    原灰度图像: image single-channel 8-bit input image.
    输出图像 (支持原地计算,可为输入图像): edges output edge map; it has the same size and type as image
    低阈值的: threshold1 first threshold for the hysteresis procedure.
    高阈值的3倍 (Canny 推荐的 高:低 阈值比在 2:1 到3:1之间): threshold2 second threshold for the hysteresis procedure.

    //! applies generalized Sobel operator to the image
    CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,
                             int dx, int dy, int ksize=3,
                             double scale=1, double delta=0,
                             int borderType=BORDER_DEFAULT );

    Sobel算子
    (对灰度渐变和噪声较多的图像处理效果较好。Sobel算子对于边缘定位比较准确)
    是一个离散微分算子 (discrete differentiation operator), 它用来计算图像灰度函数的近似梯度。
    通过像素点空间邻域内上下,左右相邻点的灰度加权运算,求取物体边缘(边缘是指一个物体与另一个物体的分界处,一般边缘内外处都会有灰度值上的差异)
    Sobel 算子结合了高斯平滑和微分求导, Scharr更准确地计算 3 X 3 核(Gx、Gy卷积因子)的导数
    X\Y两个方向求导(输入图像与卷积核Gx和Gy进行卷积)-> 图像的每一点,结合以上两个结果求出近似梯度 -> 定位梯度值大于邻域的相素,作为边缘
    ddepth: value as below
    CV_8U = 0,
    CV_8S = 1,
    CV_16U = 2,
    CV_16S = 3,
    CV_32S = 4,
    CV_32F = 5,
    CV_64F = 6,
    CV_USRTYPE1 = 7;

    展开全文
  • 学习DIP第58天 转载请标明本文出处:... 更多图像处理机器学习内容请访问最新网站www.tony4ai.com 开篇废话 继续说废话,昨天写博客被同事看到了,问我,为什么你每一篇...
  • 4.1图像分割区域生长法

    万次阅读 多人点赞 2018-08-04 16:37:39
    传统的区域分割方法有区域生长和区域分裂与合并, 其中最基础的是区域生长法。 区域生长法  区域生长是根据事先定义的准则将像素或者子区域聚合成更大区域的过程。其基本思想是从一组生长点开始...
  • 基于区域分割图像分割)

    万次阅读 2016-06-26 10:46:45
    原文地址:基于区域分割图像分割)作者:小届哥哥1. 区域生长 区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或...
  • 肿瘤区域图像分割

    千次阅读 2019-12-24 12:14:35
    肿瘤分割任务由于个体间形状、纹理等差异大,从而实现更加困难。本文就来分析一下,肿瘤分割任务。 在传统医学诊断中,专家的判断几乎是一个决定性的考量因素。即使在深度学习和人工智能快速发展的今天,医学诊断...
  • 区域生长法图像分割

    2021-01-18 17:13:30
    传统的区域分割方法有区域生长和区域分裂与合并,其中最基础的是区域生长法。 区域生长法 区域生长是根据事先定义的准则将像素或者子区域聚合成更大区域的过程。其基本思想是从一组生长点开始(生长点可以是单个像素...
  • 文章目录1. 区域归并2. 区域分裂3. 分裂与归并4. 分水岭分割5. 区域增长后处理匹配1. 模板匹配2. 模板匹配的控制策略分割的评测...一致性是区域的一个重要性质,在区域增氏中用作主要的分割准则,它的基本思想是将图
  • 在对已有算法分析的基础上,提出基于古典概率理论的图像生成模型,重点介绍区域合并思想与统计理论相结合的合并预测准则,该准则是逐步松弛的,确保在无像素遗漏的同时分割的精度。算法不但考虑了像素的相似性,还考虑了...
  • 从本周开始,新专栏《图像分割应用》就跟大家见面了。本专栏主要介绍图像分割在各个领域的应用、难点、技术要求等常见问题。本文是专栏《图像分割应用》的第1篇文章,首先来聊聊医...
  • 大脑区域图像分割

    千次阅读 2019-12-23 11:56:19
    一、任务分析 医学领域中,为了满足病情诊断、治疗方案制定等需求,常常需要对病人进行扫描,从而确定各内部...因此,为了辅助诊断,减小误诊的概率,现阶段的医学图像分析中经常会借助深度学习的方法。 医学图像...
  • 图像分割

    万次阅读 2019-03-22 20:07:54
    图像分割是指将图像分成若干互不重叠的子区域,使得同一个子区域内的特征具有一定相似性,不同子区域的特征呈现较为明显的差异。 常用方法 1.基于阈值的分割方法 2.基于边缘检测的分割方法 3.基于区域分割方法 4....
  • 提出一种基于高斯统计模型的快速图像区域分割算法,与已有的一些图像区域分割算法相比,该方法不用图像去噪,直接利用噪声建立高斯统计模型,还采用最大最小值的方法,提出初始分割的思想。实验结果表明新方法增强了分割...
  • 针对现有 图像 多阈值分割方法存在的分割不够准确、计算复杂度较 高等问题 ,利用 Otsu多阈值 分割思想 ,提 出一种基于聚类和局部区域的彩色图像多闽值分割方法。获取彩色图像的H分量直方图;在综合考虑以 H分量...
  • python+opencv图像分割分割不规则ROI区域方法汇总

    万次阅读 多人点赞 2019-05-29 18:06:30
    图像分割领域,一个重要任务便是分割出感兴趣(ROI)区域。如果是简易的矩形ROI区域其实是非常容易分割的,opencv的官方python教程里也有教到最简易的矩形ROI分割(剪裁),其本质是多维数组(矩阵)的切片。但是...
  • 图像分割-连通区域分析

    千次阅读 2018-06-21 11:33:58
    转自:https://blog.csdn.net/icvpr/article/details/10259577OpenCV_连通区域分析(Connected Component Analysis/Labeling)【摘要】本文主要介绍在CVPR和图像处理领域中较为常用的一种图像区域(Blob)提取的方法...
  • 图像分割_区域生长

    千次阅读 2013-06-26 16:09:41
    区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至... 区域增长方法是一种比较普遍的方法,在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图象
  • 图像分割基本原理介绍

    千次阅读 2015-05-30 00:08:04
    基本原理:图像分割指的是根据图像的灰度,颜色,结构,纹理等特征设计合理的准则函数设计一个或多个阈值从而将图像中的像素点逐个与设定阈值比较进而将图像分割成若干个互不交叠的区域。 方法一,基于阈值分割方法...
  • 区域生长(基于区域图像分割

    千次阅读 2014-05-08 14:51:16
    区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或其它区域归并到目前的区域中从而逐步增长区域,直至没有可以归并的...
  • 图像分割_区域分裂合并

    千次阅读 2013-06-26 16:08:18
    区域分裂合并算法的基本思想是先确定一个分裂合并的准则,即区域特征一致性的测度,当图像中某个区域的特征不一致时就将该区域分裂成4 个相等的子区域,当相邻的子区域满足一致性特征时则将它们合成一个大区域,直至所有...
  • 阈值分割与区域分割

    万次阅读 2017-01-02 13:22:51
    阈值分割我们曾在3.5节学习过灰度阈值变换的相关知识, 利用灰度阈值变换分割图像就称为阈值分割, 它是一种基本的图像分割方法。 阙值分割的基本思想是确定一个阈值, 然后把每个像素点的灰度值和阈值相比较,根据...
  • 图像分割——区域生长

    千次阅读 2013-01-06 15:21:51
    基于区域图像分割-----------区域生长 1. 区域生长 区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或其它...
  • 许多情况下,图像中目标区域与背景区域或者说不同区域之间其灰度值存在差异,此时可以将灰度的均一性作为依据进行分割。阈值分割即通过一个或几个阈值将图像分割成不同的区域。  阈值分割方法的核心在于如何寻找...
  • 图像分割综述

    万次阅读 多人点赞 2019-07-09 22:03:48
    所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一副图像中,把目标...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,332
精华内容 9,332
关键字:

区域分割图像的基本思想