关于图像分割:Matlab实现图像分割

文章和代码以及样例图片等相干资源,曾经归档至【Github仓库:digital-image-processing-matlab】或者公众号【AIShareLab】回复 数字图像处理 也可获取。目标把握线检测边缘检测应用梯度的分水岭宰割管制标记符的分水岭宰割内容线检测%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function B=pixeldup(A, m, n)if nargin<2; error('At least two inputs are required');endif nargin==2; n=m;endu=1:size(A,1);m=round(m);u=u(ones(1,m), :);u=u(:);v = 1:size(A,1);n=round(n);v=v(ones(1,n), :);v=v(:);B=A(u,v);%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1005(a)(wirebond_mask).tif');figure,imshow(f);w=[2 -1 -1;-1 2 -1;-1 -1 2];g=imfilter(double(f),w);figure,imshow(g,[])%fig 2gtop=g(1:120,1:120);gtop=pixeldup(gtop, 4);figure,imshow(gtop,[])%fig 3gbot=g(end-119:end,end-119:end);gbot=pixeldup(gbot,4);figure,imshow(gbot,[])%fig 4g=abs(g);figure,imshow(g,[])%fig 5T=max(g(:));g=g>=T;figure,imshow(g)%fig 6%%%%%%%%%%%%%%%%%%%%%%%%边缘检测%%%%%%%%%%%%%%%%%%%%%%%%%%%clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1016(a)(building_original).tif');figure,imshow(f);[gv,t]=edge(f,'sobel','vertical');figure,imshow(gv);tgv=edge(f,'sobel',0.15,'vertical');figure,imshow(gv);gboth=edge(f,'sobel',0.15);figure,imshow(gboth);w45=[-2 -1 0;-1 0 1;0 1 2]g45=imfilter(double(f),w45,'replicate');T=0.3*max(abs(g45(:)));g45=g45>=T;figure,imshow(g45);%%%%%%%%%%%%%%%%%%%%%%%%%Sobel,LoG 和Canny 边缘检测器的比拟clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1016(a)(building_original).tif');figure,imshow(f);[g_sobel_default,ts]=edge(f,'sobel');figure,imshow(g_sobel_default);[g_log_default,tlog]=edge(f,'log');figure,imshow(g_log_default);[g_canny_default,tc]=edge(f,'canny');figure,imshow(g_canny_default);[g_sobel_best,ts]=edge(f,'sobel',0.05);figure,imshow(g_sobel_best);[g_log_best,tlog]=edge(f,'log',0.003,2.25);figure,imshow(g_log_best);[g_canny_best,tc]=edge(f,'canny',[0.04 0.10],1.5);figure,imshow(g_canny_best);应用梯度的分水岭宰割clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1057(a)(small_blobs-original).tif');figure,imshow(f);h=fspecial('sobel');fd=double(f);g=sqrt(imfilter(fd,h,'replicate').^2+... imfilter(fd,h','replicate').^2);figure,imshow(g);L=watershed(g);figure,imshow(L);wr=L==0;g2=imclose(imopen(g,ones(3,3)),ones(3,3));figure,imshow(g2);L2=watershed(g2);figure,imshow(L2);wr2=L2==0;f2=f;f2(wr2)=255;figure,imshow(f2);管制标记符的分水岭宰割%%%%%%%%%%%%%%%%了解每幅图像的含意%%%%%%%%%%%clear allclcf=imread('D:\pic\DIP3E_CH10\Fig1057(a)(small_blobs-original).tif');figure,imshow(f);h=fspecial('sobel');fd=double(f);g=sqrt(imfilter(fd,h,'replicate').^2+...imfilter(fd,h','replicate').^2);L=watershed(g);wr=L==0;rm=imregionalmin(g);figure,imshow(rm);im=imextendedmin(f,2);figure,imshow(im);fim=f;fim(im)=175;figure,imshow(fim);Lim=watershed(bwdist(im));figure,imshow(Lim);em=Lim==0;g2=imimposemin(g,im|em);figure,imshow(g2);L2=watershed(g2);figure,imshow(L2);f2=f;f2(L2==0)=255;figure,imshow(f2);参考文献: [1] Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA. [2] [阮秋琦. 数字图像处理(MATLAB版)[M]. 北京:电子工业出版社, 2014.](https://github.com/timerring/digital-image-processing-matlab/blob/main/reference/Digital_Image_Processing_(MATLAB_version).pdf) ...

March 9, 2023 · 1 min · jiezi

关于图像分割:图像分割二区域生长和区域分裂

上文曾经说到,图像宰割就是获取你感兴趣的物体或区域的过程。图像宰割中,基于区域的办法是以间接寻找区域为根底的宰割技术 一.区域成长1.基本原理区域成长法是较为根底的一种区域分割办法它的根本思维我说的艰深些,即是一开始有一个生长点(能够一个像素也能够是一个小区域),从这个生长点开始往外裁减,裁减的意思就是它会把跟本人有类似特色的像素或者区域拉到本人的队伍里,以此壮大本人的势力范围,每次扩充后的势力范围就是一个新的生长点,始终成长始终成长,直到不能成长为止。所以很容易就能总结进去三个要点:(1)一个适合的像素或者小区域作为开始的生长点(2)成长准则,也就是通过什么规范你能力拉他入伙(3)进行成长的条件 什么时候进行裁减 2.简略例子阐明上面是一个简略的例子:此例子截图来自:https://blog.csdn.net/webzhuc... 3.代码import cv2import numpy as np###########################################################################################################################################################################class Point(object): def __init__(self, x, y): self.x = x self.y = y def getX(self): return self.x def getY(self): return self.yconnects = [ Point(-1, -1), Point(0, -1), Point(1, -1), Point(1, 0), Point(1, 1), Point(0, 1), Point(-1, 1), Point(-1, 0)]###################################################################################### 计算两个点间的欧式间隔def get_dist(seed_location1, seed_location2): l1 = im[seed_location1.x, seed_location1.y] l2 = im[seed_location2.x, seed_location2.y] count = np.sqrt(np.sum(np.square(l1 - l2))) return count# import Imageim = cv2.imread('./7.jpg')cv2.imshow('src', im)im_shape = im.shapeheight = im_shape[0]width = im_shape[1]print('the shape of image :', im_shape)# 标记,判断种子是否曾经成长img_mark = np.zeros([height, width])cv2.imshow('img_mark', img_mark)# 建设空的图像数组,作为一类img_re = im.copy()for i in range(height): for j in range(width): img_re[i, j][0] = 0 img_re[i, j][1] = 0 img_re[i, j][2] = 0cv2.imshow('img_re', img_re)# 取一点作为种子点seed_list = []seed_list.append(Point(15, 15))T = 7 # 阈值class_k = 1 # 类别# 成长一个类while (len(seed_list) > 0): seed_tmp = seed_list[0] # 将以成长的点从一个类的种子点列表中删除 seed_list.pop(0) img_mark[seed_tmp.x, seed_tmp.y] = class_k # 遍历8邻域 for i in range(8): tmpX = seed_tmp.x + connects[i].x tmpY = seed_tmp.y + connects[i].y if (tmpX < 0 or tmpY < 0 or tmpX >= height or tmpY >= width): continue dist = get_dist(seed_tmp, Point(tmpX, tmpY)) # 在种子汇合中满足条件的点进行成长 if (dist < T and img_mark[tmpX, tmpY] == 0): img_re[tmpX, tmpY][0] = im[tmpX, tmpY][0] img_re[tmpX, tmpY][1] = im[tmpX, tmpY][1] img_re[tmpX, tmpY][2] = im[tmpX, tmpY][2] img_mark[tmpX, tmpY] = class_k seed_list.append(Point(tmpX, tmpY))######################################################################################### 输入图像cv2.imshow('OUTIMAGE', img_re)cv2.waitKey(0)左边的图让我想起来 离别巨匠外面邓超演的拉不拉卡(反正就是很黑) hhh ...

February 23, 2023 · 2 min · jiezi

关于图像分割:全球首个面向遥感任务设计的亿级视觉Transformer大模型

作者:京东摸索研究院深度学习在很大水平上影响了遥感影像剖析畛域的钻研。然而,大多数现有的遥感深度模型都是用ImageNet预训练权重初始化的,其中天然图像不可避免地与航拍图像相比存在较大的域差距,这可能会限度上游遥感场景工作上的微调性能。   为此,京东摸索研究院联结武汉大学、悉尼大学借助迄今为止最大的遥感场景标注数据集MillionAID,从头开始训练包含卷积神经网络(CNN)和曾经在天然图像计算机视觉工作中体现出了良好性能的视觉Transformer(Vision Transformer)网络,首次取得了一系列基于监督学习的遥感预训练根底骨干模型。并进一步钻研了ImageNet预训练(IMP)和遥感预训练(RSP)对包含语义宰割、指标检测在内的一系列上游工作的影响。   试验后果证实了摸索研究院先前提出的先进Vision Transformer系列模型ViTAE在遥感工作上的优越性,并发现RSP在遥感工作上的有效性以及感知相干语义方面具备的独特性。试验后果进一步表明RSP会受到上下游工作差别的影响,这些发现对遥感大规模数据集和预训练方法提出了新的要求。   01 钻研背景 近年来,深度学习凭借主动提取反映物体固有属性的深度特色的劣势,在计算机视觉畛域获得了令人印象粗浅的冲破,遥感畛域也不例外。在遥感畛域,最罕用的是深度模型是卷积神经网络(CNN)。 目前,简直所有的遥感深度模型都是在计算机视觉畛域最驰名的图像数据集 ImageNet-1K 数据集上进行预训练,该数据集中来自 1,000 个不同类别的百万张真实世界图像使模型可能学习弱小的示意。而后这些预训练后的模型被能够用做遥感工作的骨干网络进行进一步微调。   只管这些模型在遥感工作中获得了显著的成果,但仍有一些问题须要钻研。直观地说,与天然图像相比,遥感图像在视角、色彩、纹理、布局、对象等方面显著存在较大的域差距。以前的办法试图通过进一步微调遥感图像数据集上的预训练模型来放大这一差距。然而,ImageNet预训练(IMP)引入的零碎偏差对性能有着不可漠视的副作用。另一方面,咱们留神到,随着遥感技术的提高,各种各样的传感器捕捉到了丰盛的遥感图像,能够用于预训练。作为一个代表性的例子,MillionAID 是迄今为止最大的遥感图像数据集,它是从蕴含多种传感器图像的谷歌地球(GE)上收集的,并且具备相似ImageNet-1K的百万级图像数量规模,这使遥感预训练(RSP)成为可能。   RSP可能从头开始训练深度模型,这意味着候选模型不用局限于现成的CNN。因而,在本文中,咱们也钻研了视觉Transformer(Vision Transformer)的骨干网络,它们在计算机视觉畛域体现出了令人诧异的性能。与CNN中善于部分建模的卷积相比,Vision Transformer中的多头自留神(MHSA)可能灵便地捕获不同的全局上下文。最近,摸索研究院提出的ViTAE模型摸索了卷积和MHSA的平行结构,以同时建模局部性和长程依赖性,在ImageNet分类工作和上游视觉工作上获得了很好的后果。此外,它还通过扩张卷积模块和层级设计提取多尺度特色,这对于计算机视觉上游工作,尤其是在遥感图像了解工作,都具备重要的价值。因而咱们钻研了CNN和层级Vision Transformer网络通过RSP后,在场景辨认、语义宰割、指标检测和变化检测等遥感工作上的微调性能。为了实现这些指标,咱们在九个风行的数据集上进行了宽泛的试验,并得出了一些无益的论断。RSP是遥感图像了解中的一个新兴钻研方向,但仍处于摸索阶段,尤其是基于Vision Transformer这种新型网络架构的预训练方法。咱们心愿这项钻研可能填补这一空白,并为将来的钻研提供有用的见解。   02 MillionAID, ViTAE 和ViTAEv2的介绍   1.MillionAID MillionAID 是迄今为止遥感畛域最大的数据集。它蕴含 100,0848 个不重叠的场景,有51类,每类大概有2,000-45,000图像。该数据集来自谷歌地球,由包含但不限于 SPOT、IKONOS、WorldView 和 Landsat 系列的多种传感器组成,因此图像分辨率不同。最大分辨率可达0.5m,最小的则有153m。图像大小范畴从 110110 到 31,67231,672。该数据集均为RGB图像,非常适合训练典型的视觉神经网络模型。   2.ViTAE 和ViTAEv2    ViTAE是摸索研究院最近提出的先进Vision Transformer模型,它采纳深窄式设计,在网络开始时迅速降采样,而后将网络加深,在进步性能的同时升高模型大小和计算成本。ViTAE 模型首先通过三个Reduction Cell将输出图像下采样到1/16分辨率。与 ViT 相似,在增加地位编码之前,将class token与第三个Reduction Cell的输入连贯。而后重叠多个Normal Cell,并始终保持特色图分辨率。最初一个Normal Cell的class token输出到线性层进行分类。ViTAE 模型在 ImageNet 数据集上分类性能表现出色,但它不不便像CNN那样产生层次化的两头特色,从而迁徙到宰割、检测和姿势预计等其它上游工作(目前有一些新技术来解决这个问题,例如ViTDet,并已获得较好成绩,请关注咱们的复现Repo:https://github.com/ViTAE-Tran...)。   在此基础上,摸索研究院提出了 ViTAEv2,它采纳了 ResNet 和 Swin 等风行骨干网络的层次化设计。在 ViTAEv2 中,网络被分成四个阶段。每个阶段首先采纳Reduction Cell进行下采样,而后重叠多个 Normal Cell进行特色变换。在最初一个阶段的Normal Cell后应用全局均匀池化层来替换class token。当对上游工作进行微调时,该池化层被移除,剩下的网络与相应工作的解码器相连。图 2 显示了原始 ViTAE 和 ViTAEv2的网络架构。 ...

February 1, 2023 · 4 min · jiezi

关于图像分割:技术博客丨动手实践系列CV语义分割

作者:游璐颖,福州大学,Datawhale成员 图像宰割是计算机视觉中除了分类和检测外的另一项根本工作,它意味着要将图片依据内容宰割成不同的块。相比图像分类和检测,宰割是一项更精密的工作,因为须要对每个像素点分类。 如下图的街景宰割,因为对每个像素点都分类,物体的轮廓是精准勾画的,而不是像检测那样给出边界框。 图像宰割能够分为以下三个子畛域:语义宰割、实例宰割、全景宰割。 由比照图可发现,语义宰割是从像素档次来辨认图像,为图像中的每个像素制订类别标记,目前广泛应用于医学图像和无人驾驶等;实例宰割绝对更具备挑战性,不仅须要正确检测图像中的指标,同时还要准确的宰割每个实例;全景宰割综合了两个工作,要求图像中的每个像素点都必须被调配给一个语义标签和一个实例id。 01 语义宰割中的关键步骤在进行网络训练时,时常须要对语义标签图或是实例宰割图进行预处理。如对于一张黑白的标签图,通过色彩映射表失去每种色彩所代表的类别,再将其转换成相应的掩膜或Onehot编码实现训练。这里将会对于其中的关键步骤进行解说。 首先,以语义宰割工作为例,介绍标签的不同表达形式。 1.1 语义标签图语义宰割数据集中包含原图和语义标签图,两者的尺寸大小雷同,均为RGB图像。 在标签图像中,红色和彩色别离代表边框和背景,而其余不同色彩代表不同的类别: 1.2 单通道掩膜每个标签的RGB值与各自的标注类别对应,则能够很容易地查找标签中每个像素的类别索引,生成单通道掩膜Mask。 如上面这种图,标注类别包含:Person、Purse、Plants、Sidewalk、Building。将语义标签图转换为单通道掩膜后为右图所示,尺寸大小不变,但通道数由3变为1。 每个像素点地位一一对应。 1.3 Onehot编码Onehot作为一种编码方式,能够对每一个单通道掩膜进行编码。 比方对于上述掩膜图Mask,图像尺寸为,标签类别共有5类,咱们须要将这个Mask变为一个5个通道的Onehot输入,尺寸为,也就是将掩膜中值全为1的像素点抽取出生成一个图,相应地位置为1,其余为0。再将全为2的抽取出再生成一个图,相应地位置为1,其余为0,以此类推。 02 语义宰割实际接下来以Pascal VOC 2012语义宰割数据集为例,介绍不同表达形式之间应该如何互相转换。 实际采纳的是Pascal VOC 2012语义宰割数据集,它是语义宰割工作中非常重要的数据集,有 20 类指标,这些指标包含人类、机动车类以及其余类,可用于指标类别或背景的宰割。 数据集开源地址: https://gas.graviti.cn/datase... 2.1 数据集读取本次应用格物钛数据平台服务来实现数据集的在线读取,平台反对多种数据集类型,且提供了很多公开数据集便于应用。在应用之前先进行一些必要的筹备工作: Fork数据集:如果须要应用公开数据集,则须要将其先fork到本人的账户。获取AccessKey:获取应用SDK与格物钛数据平台交互所需的密钥,链接为https://gas.graviti.cn/tensor...了解Segment:数据集的进一步划分,如VOC数据集分成了“train”和“test”两个局部。 2.2 色彩映射表在失去黑白语义标签图后,则能够构建一个色彩表映射,列出标签中每个RGB色彩的值及其标注的类别。 2.3 Label与Onehot转换依据映射表,实现语义标签图与Onehot编码的互相转换: 2.4 Onehot与Mask转换同样,借助映射表,实现单通道掩膜Mask与Onehot编码的互相转换: 更多信息请拜访格物钛官网

December 15, 2021 · 1 min · jiezi