当前位置: 首页 > news >正文

铜川网站建设哪家好白云鄂博矿区网站建设

铜川网站建设哪家好,白云鄂博矿区网站建设,罗湖网站建设价格,携车网网站开发怎么样python计算机视觉编程——9.图像分割 9.图像分割9.1 图割安装Graphviz下一步#xff1a;正文9.1.1 从图像创建图9.1.2 用户交互式分割 9.2 利用聚类进行分割9.3 变分法 9.图像分割 9.1 图割 可以选择不装Graphviz#xff0c;因为原本觉得是要用#xff0c;后面发现好像用不… python计算机视觉编程——9.图像分割 9.图像分割9.1 图割安装Graphviz下一步正文9.1.1 从图像创建图9.1.2 用户交互式分割 9.2 利用聚类进行分割9.3 变分法 9.图像分割 9.1 图割 可以选择不装Graphviz因为原本觉得是要用后面发现好像用不到。不安装可直接跳到下一步 安装Graphviz 首先需要先下载Graphviz软件Download | Graphviz那些包先不要下载网上说先下载包再下载软件会报错。在安装过程中需要注意下图中的一步其余都是一直下一步就行 检查一下环境变量的路径 接着在自己创建的虚拟环境下安装包 pip install pydotplus pip install graphviz 这里需要注意的是还需要再安装一个包否则单单安装上面的会报错 pip install python-graphviz 测试代码 from graphviz import Digraph dot Digraph(commentThe Round Table) dot.node(A, King Arthur) dot.node(B, Sir Bedevere the Wise) dot.node(L, Sir Lancelot the Brave)dot.edges([AB, AL]) dot.edge(B, L, constraintfalse) print(dot.source) dot.render(round-table.gv,formatjpg, viewTrue) 下一步正文 图割将一个有向图分割成两个互不相交的集合基本思想相似且彼此相近的像素应该划分到同一区域 图割CC是图中所有边的集合的“代价”函数定义为所有割的边的权重求合相加 E c u t ∑ ( i , j ) ∈ C w i j E_{cut}\sum_{(i,j)\in C}w_{ij} Ecut​(i,j)∈C∑​wij​ w i j w_{ij} wij​是图中节点i到节点j的边 ( i , j ) (i,j) (i,j)的权重并且是对割C所有的边进行求和 我们需要用图来表示图像并对图进行划分以使得 E c u t E_{cut} Ecut​最小。同时在用图表示图像时需要额外增加两个节点源点和汇点并仅考虑那些将源点和汇点分开的割 寻找最小割等同于在源点和汇点间寻找最大流这里需要用到python-graph工具包 注不是 p i p 下载 ! \color{red}{注不是pip下载!} 注不是pip下载!工具包地址如下GitHub - pmatiello/python-graph: New official repository: https://github.com/Shoobx/python-graph 下载完后把文件夹放入导包的根目录 根据路径进行引包如果引入没有报错就说明没有问题 from python_graph.core.pygraph.classes.digraph import digraph from python_graph.core.pygraph.algorithms.minmax import maximum_flow这里我是报错了“jaraco.text中没有drop_comment, join_continuation, yield_lines函数的问题然后我在”_jaraco_text.py文件里找到了这三个函数索性就直接把他提到根目录上发现就没报错了 另一个导包路径错误在digraph.py和minmax.py文件中 接着就可以运行代码了 gr digraph() gr.add_nodes([0,1,2,3]) gr.add_edge((0,1), wt4) gr.add_edge((1,2), wt3) gr.add_edge((2,3), wt5) gr.add_edge((0,2), wt3) gr.add_edge((1,3), wt4) flows,cuts maximum_flow(gr,0,3) print(flow is:, flows) print(cut is:, cuts)9.1.1 从图像创建图 我们需要利用图像像素作为节点定义一个图除了像素节点外还有两个特定的节点——“源”点和“汇”点来分别代表图像的前景和背景我们需要做的是将所有像素与源点、汇点链接起来。 每个像素节点都有一个从源点的传入边每个像素节点都有一个到汇点的传出边每个像素节点都有一条传入边和传出边连接到它的近邻。 接着需要用朴素贝叶斯分类器进行分类我们将第8章的BayesClassifier类搬过来 def build_bayes_graph(im,labels,sigma1e2,kappa1): 从像素四邻域建立一个图前景和背景(前景用1标记背景用-1标记其他的用0标记)由labels决定,并用朴素贝叶斯分类器建模m,n im.shape[:2]# 每行是一个像素的RGB向量vim im.reshape((-1,3))# 前景和背景(RGB)foreground im[labels1].reshape((-1,3))background im[labels-1].reshape((-1,3)) train_data [foreground,background]# 训练朴素贝叶斯分类器bc BayesClassifier()bc.train(train_data)# 获取所有像素的概率bc_lables,prob bc.classify(vim)prob_fg prob[0]prob_bg prob[1]# 用m*n2 个节点创建图gr digraph()gr.add_nodes(range(m*n2))source m*n # 倒数第二个是源点sink m*n1 # 最后一个节点是汇点# 归一化for i in range(vim.shape[0]):vim[i] vim[i] / (np.linalg.norm(vim[i]) 1e-9)# go through all nodes and add edgesfor i in range(m*n):# 从源点添加边gr.add_edge((source,i),wtprob_fg[i]/(prob_fg[i]prob_bg[i]))# 向汇点添加边gr.add_edge((i,sink),wtprob_bg[i]/(prob_fg[i]prob_bg[i]))# 向相邻节点添加边if i%n ! 0: # 左边存在edge_wt kappa*np.exp(-1.0*sum((vim[i]-vim[i-1])**2)/sigma)gr.add_edge((i,i-1),wtedge_wt)if (i1)%n ! 0: # 如果右边存在edge_wt kappa*np.exp(-1.0*sum((vim[i]-vim[i1])**2)/sigma)gr.add_edge((i,i1),wtedge_wt)if i//n ! 0: # 如果上方存在edge_wt kappa*np.exp(-1.0*sum((vim[i]-vim[i-n])**2)/sigma)gr.add_edge((i,i-n),wtedge_wt)if i//n ! m-1: # 如果下方存在edge_wt kappa*np.exp(-1.0*sum((vim[i]-vim[in])**2)/sigma)gr.add_edge((i,in),wtedge_wt)return gr def gauss(m,v,x): Evaluate Gaussian in d-dimensions with independent mean m and variance v at the points in (the rows of) x. http://en.wikipedia.org/wiki/Multivariate_normal_distribution if len(x.shape)1:n,d 1,x.shape[0]else:n,d x.shape# covariance matrix, subtract meanS np.diag(1/v)x x-m# product of probabilitiesy np.exp(-0.5*np.diag(np.dot(x,np.dot(S,x.T))))# normalize and returnreturn y * (2*np.pi)**(-d/2.0) / (np.sqrt(np.prod(v)) 1e-6)写入新函数 def build_bayes_graph(im,labels,sigma1e2,kappa1): 从像素四邻域建立一个图前景和背景(前景用1标记背景用-1标记其他的用0标记)由labels决定,并用朴素贝叶斯分类器建模m,n im.shape[:2]# 每行是一个像素的RGB向量vim im.reshape((-1,3))# 前景和背景(RGB)foreground im[labels1].reshape((-1,3))background im[labels-1].reshape((-1,3)) train_data [foreground,background]# 训练朴素贝叶斯分类器bc BayesClassifier()bc.train(train_data)# 获取所有像素的概率bc_lables,prob bc.classify(vim)prob_fg prob[0]prob_bg prob[1]# 用m*n2 个节点创建图gr nx.DiGraph()nodes[]for i in range(m*n2):nodes.append(str(i))gr.add_nodes_from(nodes)source m*n # 倒数第二个是源点sink m*n1 # 最后一个节点是汇点# 归一化for i in range(vim.shape[0]):vim[i] vim[i] / (np.linalg.norm(vim[i]) 1e-9)# go through all nodes and add edgesfor i in range(m*n):# 从源点添加边gr.add_edge(str(source),str(i),capacityprob_fg[i]/(prob_fg[i]prob_bg[i]))# 向汇点添加边gr.add_edge(str(i),str(sink),capacityprob_bg[i]/(prob_fg[i]prob_bg[i]))# 向相邻节点添加边if i%n ! 0: # 左边存在edge_wt kappa*np.exp(-1.0*sum((vim[i]-vim[i-1])**2)/sigma)gr.add_edge(str(i),str(i-1),capacityedge_wt)if (i1)%n ! 0: # 如果右边存在edge_wt kappa*np.exp(-1.0*sum((vim[i]-vim[i1])**2)/sigma)gr.add_edge(str(i),str(i1),capacityedge_wt)if i//n ! 0: # 如果上方存在edge_wt kappa*np.exp(-1.0*sum((vim[i]-vim[i-n])**2)/sigma)gr.add_edge(str(i),str(i-n),capacityedge_wt)if i//n ! m-1: # 如果下方存在edge_wt kappa*np.exp(-1.0*sum((vim[i]-vim[in])**2)/sigma)gr.add_edge(str(i),str(in),capacityedge_wt)return gr def show_labeling(im,labels):显示图像的前景和背景区域。前景labels1,背景labels-1其他labels0 imshow(im)contour(labels,[-0.5,0.5])contourf(labels,[-1,-0.5],colorsb,alpha0.25)contourf(labels,[0.5,1],colorsr,alpha0.25)#axis(off)xticks([])yticks([])def cut_graph(gr,imsize): Solve max flow of graph gr and return binary labels of the resulting segmentation. # print(gr)m,nimsizesourcem*n # second to last is sourcesinkm*n1 # last is sink# cut the graphflows,cuts maximum_flow(gr,source,sink) # print(cuts)# convert graph to image with labelsres np.zeros(m*n)for pos,label in list(cuts.items())[:-2]: # 遍历所有节点忽略源节点和汇节点# 但因为cuts.items()返回的是元组需先转成列表再进行切片res[pos] labelreturn res.reshape((m,n))其中书本中from scipy.misc import imresize模块已经不存在于imresize中这里使用Pillow库中的resize函数进行替代 resize_image_pillow def resize_image_pillow(image_path, output_path, scale_factor):# 打开图像文件with Image.open(image_path) as img:# 计算新的尺寸new_width int(img.width * scale_factor)new_height int(img.height * scale_factor)# 使用双线性插值调整图像大小img_resized img.resize((new_width, new_height), resampleImage.BILINEAR)# 保存调整后的图像 # return img_resizedimg_resized.save(output_path)import numpy as np from PIL import Image from pylab import *# resize_image_pillow(empire.jpg, empire.jpg, 0.07) imnp.array(Image.open(empire.jpg)) sizeim.shape[:2] labelsnp.zeros(size) labels[3:18,3:18]-1 labels[-18:-3,-18:-3]1# 对图进行分割 g build_bayes_graph(im,labels,kappa1) rescut_graph(g,size)figure() show_labeling(im,labels)figure() imshow(res) gray() axis(off)show()9.1.2 用户交互式分割 def create_msr_labels(m, lassoFalse): Create label matrix for training fromuser annotations. labels np.zeros(im.shape[:2])# backgroundlabels[m 0] -1labels[m 64] -1# foregroundif lasso:labels[m 255] 1else:labels[m 128] 1return labels# load image and annotation map im array(Image.open(empire.jpg)) m array(Image.open(empire.bmp)) # resize scale 0.1 im imresize(im, scale, interpbilinear) m imresize(m, scale, interpnearest) # create training labels labels create_msr_labels(m, False) # build graph using annotations g build_bayes_graph(im, labels, kappa2)# cut graph res cut_graph(g, im.shape[:2]) # remove parts in background res[m 0] 1 res[m 64] 1# plot the result figure() imshow(res) gray() xticks([]) yticks([]) savefig(labelplot.pdf)9.2 利用聚类进行分割 def ncut_graph_matrix(im,sigma_d1e2,sigma_g1e-2): 创建用于归一化割的矩阵其中 sigma_d 和 sigma_g 是像素距离和像素相似性的权重参数 m,n im.shape[:2] N m*n# 归一化并创建 RGB 或灰度特征向量if len(im.shape)3:for i in range(3):im[:,:,i] im[:,:,i] / im[:,:,i].max()vim im.reshape((-1,3))else:im im / im.max()vim im.flatten()# x,y 坐标用于距离计算xx,yy meshgrid(range(n),range(m))x,y xx.flatten(),yy.flatten()# 创建边线权重矩阵W zeros((N,N),f)for i in range(N):for j in range(i,N):d (x[i]-x[j])**2 (y[i]-y[j])**2 W[i,j] W[j,i] exp(-1.0*sum((vim[i]-vim[j])**2)/sigma_g) * exp(-d/sigma_d)return Wfrom scipy.cluster.vq import * def cluster(S,k,ndim): 从相似性矩阵进行谱聚类 # 检查对称性if sum(abs(S-S.T)) 1e-10:print(not symmetric)# 创建拉普拉斯矩阵rowsum sum(abs(S),axis0)D diag(1 / sqrt(rowsum 1e-6))L dot(D,dot(S,D))# 计算 L 的特征向量U,sigma,V linalg.svd(L,full_matricesFalse)# 从前 ndim 个特征向量创建特征向量# 堆叠特征向量作为矩阵的列features array(V[:ndim]).T# k-meansfeatures whiten(features)centroids,distortion kmeans(features,k)code,distance vq(features,centroids)return code,V在运行下面代码之前需要安装scikit-image记得在自己的虚拟环境下安装我用pip安装不了后面改用conda只要在虚拟环境下用哪个pip或conda都是安装在虚拟环境下 conda install scikit-image import cv2 import numpy as np from pylab import * from PIL import Image from skimage.transform import resizeim Image.open(empire.jpg) m,n np.array(im).shape[:2] # 调整图像的尺寸大小为(wid,wid) wid 50rim im.resize((50,50),Image.BILINEAR) rim array(rim,f) # 创建归一化割矩阵 # print(rim.shape[:2] ) A ncut_graph_matrix(rim,sigma_d1,sigma_g1e-2) # 聚类 code,Vcluster(A,k3,ndim3) # 变换到原来的图像大小imagecode.reshape(wid,wid) print(image)codeim resize(image,(m,n),modereflect,anti_aliasingFalse,order0) # 绘制分割结果 figure() imshow(codeim) gray() show()9.3 变分法 当优化的对象是函数时该问题称为变分问题需要使用ROF进行降噪。 denoise函数需要传入以下参数 im: 输入的噪声图像灰度图像。U_init: 对 U去噪图像的初始猜测。tolerance: 收敛的容忍度用于判断迭代是否结束。tau: 步长或称为步伐用于控制更新的幅度。tv_weight: 总变差正则化项的权重控制去噪程度。 denoise函数返回参数 U: 去噪后的图像。im - U: 图像的纹理残差即原始图像中未被去噪部分的残余。 def denoise(im,U_init,tolerance0.1,tau0.125,tv_weight100): 这个函数实现了 Rudin-Osher-Fatemi (ROF) 去噪模型ROF 模型是一个常用的图像去噪方法基于总变差(Total Variation, TV)正则化来去除噪声同时保留图像的边缘信息m,nim.shape #获取图像的高度和宽度#初始化UU_initPxim # 对偶域的x分量Pyim # 对偶域的y分量error1while(errortolerance):UoldU#原始变量的梯度GradUxroll(U,-1,axis1)-U #变量U梯度的x分量GradUyroll(U,-1,axis0)-U #变量U梯度的y分量#更新对偶变量PxNewPx(tau/tv_weight)*GradUx #更新PxPyNewPy(tau/tv_weight)*GradUy #更新PyNormNewmaximum(1,sqrt(PxNew**2PyNew**2))#计算PxNew和PyNew的范数,确保其最小值为1PxPxNew/NormNew #更新x分量PyPyNew/NormNew #更新y分量RxPxroll(Px,1,axis1)#计算Px在x方向上的右移RyPyroll(Py,1,axis0)#计算Px在y方向上的下移DivP(Px-RxPx)(Py-RyPy)#计算Px和Py的梯度Uimtv_weight*DivP # 更新去噪后的图像Uerrorlinalg.norm(U-Uold)/sqrt(n*m)# 计算当前误差return U,im-U #返回去噪后的图像U和噪声图像因为 scipy.misc.imsave 已被弃用所以需要用其他库来完成这里使用Pillow库来保存图像 import numpy as np from PIL import Image im np.array(Image.open(ceramic-houses_t0.png).convert(L)) U,Tdenoise(im,im,tolerance0.001) t0.4# 基于阈值生成二值图像 binary_image U t * U.max()# 将布尔数组转换为 uint8 格式0 或 255 binary_image_uint8 (binary_image * 255).astype(np.uint8)# 创建 Image 对象 img Image.fromarray(binary_image_uint8)# 保存图像为 PDF img.save(result.pdf)from pylab import * gray() subplot(121) imshow(U) subplot(122) imshow(img)
http://www.tj-hxxt.cn/news/139102.html

相关文章:

  • 建设网站如何优化关键词深圳物流公司哪家便宜又好
  • 电商网站首页布局好网站分享
  • 学校网站建设管理网站收录上万没有流量
  • 企业网站都是静态的吗做网站编辑
  • 抚州建设银行网站郴州seo服务
  • 电子商务网站建设 ppt上海网站开发一对一培训价格
  • 沈阳网站开发久湖北建设网站
  • 建网站的费用是多少网站做适配
  • 网站推广的方法有哪些html5网页设计作业免费
  • 淘宝联盟里的网站推广怎么做有哪些wordpress博客
  • 社交网站的优点和缺点php 网站 发布
  • 做网站贵么长沙外贸公司
  • 备案 添加网站wordpress edd支付宝
  • 宁波企业如何建网站企业邮箱是哪个
  • 一个网站建设需要什么云趣在线企业网站建设
  • 主要的网站开发技术iis wordpress index.php
  • 2017网站开发新技术昆明网站建设在河科技
  • 济南城市建设集团网站郑州网站建设哪家强
  • 公司网站如何推广做交互的网站
  • ps做网站首页的尺寸北京网站优化公司哪家好
  • 福建泉州网站建设公司提供郑州网站建设
  • 网站后台程序开发wordpress frame
  • 做网站百度收费吗自适应网站建站价格
  • 珠海网站建设烟台开发区网站
  • 烟台网站seo外包常州seo排名外包
  • 一个网站突然打不开网站规划书的内容有哪些
  • 怎么做一考试网站怎么推广视频号
  • 网站 建设运行情况天津网站开发tjniu
  • 医疗门户网站模板石家庄市工程建设造价管理站网站
  • 网站经常做封面的那些番号网站建设讲话