K-means岩石铸体图像分割及孔隙度的计算
- 格式:doc
- 大小:42.50 KB
- 文档页数:7
基于K-Means的颜色量化算法在岩石图像预处理中的应用程国建;魏珺洁【摘要】提出了一种基于K-Means的颜色量化算法的岩石图像预处理方法,利用K-Means自动将图像中相似的颜色合并为一种颜色,减少了岩石图像中的无用颜色.对于颜色量化,假设RGB岩石图像中的每个像素点都有自己的颜色,并且每个像素点都有对应坐标,使用欧几里得距离公式计算每个像素点之间的距离,最后利用K-Means算法对这些有特定颜色的坐标点进行无监督聚类,从而实现颜色的量化.应用结果表明,将基于K-Means的颜色量化算法用在岩石图像中,可以减少岩石图像中的颜色数量,且能在较低性能的计算机设备中很好地再现岩石图像,同时也能提高岩石图像处理的效率.【期刊名称】《西安石油大学学报(自然科学版)》【年(卷),期】2019(034)003【总页数】6页(P114-119)【关键词】岩石图像处理;颜色量化;K-Means;像素点;聚类【作者】程国建;魏珺洁【作者单位】西安石油大学计算机学院,陕西西安710065;西安石油大学计算机学院,陕西西安710065【正文语种】中文【中图分类】TE19;TP183引言岩石图像是油气勘探与开发领域的专业图像数据,它能够反映出岩石内部的微观结构和空隙特征,是进行油气勘探与开发的重要参考。
已有许多学者对岩石图像进行研究,包括在多彩空间下利用神经网络对岩石图像进行自动识别[1]、使用卷积神经网络对岩石图像进行分类[2]、使用SIFT算法将多个岩石图像进行拼接[3]等。
然而受计算机性能的限制,在低配置的计算机中无法处理颜色数量太多的岩石图像,因此需要使用颜色量化算法来减少岩石图像中的颜色数量,同时又能更好地再现原始图像特征。
对岩石图像进行颜色量化不仅使低性能设备可以进行岩石图像的研究工作,使岩石图像更具可用性,而且可以减小图像的大小,降低图像在计算机内的存储空间,提高图像处理的效率。
1 颜色量化计算机中的彩色数字图像一般由红(R)、绿(G)、蓝(B)3种基本颜色按照某个比例混合得到,这些图像的颜色是离散的,用一组0到255之间的二进制数值表示。
介绍k-means算法
K均值(K-means)是一种常见的聚类算法,用于将数据分成K 个不同的组或簇。
该算法的目标是最小化数据点与其所属簇中心点之间的距离平方和,因此它是一种基于距离的聚类方法。
K均值算法的工作流程如下:
1. 随机选择K个初始的聚类中心点,通常是从数据集中随机选择K个数据点作为初始中心。
2. 将每个数据点分配到最近的聚类中心点所代表的簇。
3. 计算每个簇的新中心,通常是该簇中所有数据点的平均值。
4. 重复步骤2和3,直到聚类中心点不再发生变化,或者达到预定的迭代次数。
K均值算法的优点包括简单易实现、计算速度快,适用于大规模数据集。
然而,K均值算法也存在一些缺点,比如对初始聚类中心点的选择敏感,对噪音和异常值敏感,对于非凸形状的簇效果不
佳等。
在实际应用中,K均值算法常用于图像压缩、数据挖掘、模式
识别等领域。
为了提高算法的效果,还可以采用K均值的改进算法,如K均值++算法用于更好地选择初始聚类中心点,以及采用多次随
机初始化来减少局部最优解的影响等。
聚类分析在岩石图像中的应用研究作者:程国建范鹏召来源:《电脑知识与技术》2017年第07期摘要;岩石组分识别是岩石图像分析中的重要工作之一。
该文先提取岩石图像区域颜色特征,再分别使用k均值和模糊C均值两种聚类算法进行聚类,实验表明,通过提取区域颜色特征进行聚类能划分岩石组分,从而为后期的岩石组分识别奠定基础。
关键词:岩石图像;k均值聚类;模糊C均值聚类;岩石组分中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)07-0250-02图像分析是人们获取信息的一种重要手段。
聚类是通过机器学习算法将相似的对象聚在一起组成一个集合,不相似的对象分离开,并要集合内对象具有较高的相似性,而集合与集合之间的对象具有较高的互异性。
目前已有很多学者对K均值(k-means)聚类算法和模糊C均值聚(FCM)类算法及其在图像分析中的而应用进行了研究,如:曾山、严峻等对FCM算法进行了研究,朴尚哲对FCM算法进行了有效性评价;聂生东使用FCM分割算法对磁共振颅脑图像进行了研究与分析;彭立军使用FCM研究了遥感图像的分割方法等。
蒋帅、樊宁等研究了k-means聚类算法;李丹丹、刘靖明等在HIS空间下使用K-means方法研究了彩色图像的分割;廖松有_10]对比研究了FCM与K-means聚类算法等。
为了方便岩石组分分析,本文分别使用K-means聚类算法与FCM聚类算法对岩石组分进行了聚类,并有效的划分了岩石组分,为后期岩石组分分析奠定了基础。
1K-means聚类算法K-means聚类算法是麦克奎因(J.B MacQueen)于1967年提出的。
该算法简单易行,广泛应用于科学及工业领域。
它是将含有n个实体的集合X=(x1,x2,…,x n)划分为k个簇(类)。
该算法的输入时集合X与类别数k,输出是聚类结果,具体算法流程如下:1)令I=1,从具有t1个实体的样本集中随机选取k个实体作为初始聚类中心,%(D,j=1,2,…,k;2)分别计算其余n-k各个实体到各聚类中心的距离d(x i,m j(I)),i=1,2,…,n,j=1,2,…,k,并将各实体与距离最近的聚类中心聚为一类;3)分别计算每个簇内实体的平均值,并将该值作为新的聚类中心,得到k个新的聚类中心;4)分别对所有实体计算其与k个新聚类中心的距离,并将各个实体与距离最近的聚类中心聚为一类;K-means聚类算法优缺点K-means是一种基于划分的聚类算法,思想简单并易于实现,是目前最常用的聚类算法之一。
1K-means算法原理模型1967年,James MacQueen提出“K-Means”(K均值),是基于距离的聚类算法。
两个对象距离越近,相似度越大,对指定的K个划分,迭代确定每个簇的中心和比较靠近该中心的归属节点,达到平方误差最小的平衡状态。
算法算法的描述如下:1、随机选取k个聚类质心点(cluster centroids)为u1,u2,…,uk∈Rn.2、重复下面过程直到收敛{对于每一个样例i,计算与质心的最小距离,判断其应该属于的类对于每一个类j,重新计算该类的质心,向量的平均值}算法的目标函数如下:J函数表示每个样本点到其质心的距离平方和。
K-means是要将J调整到最小。
固定每类的质心u(j),调整样本的所属类别c(i),让J函数减少。
然后,固定c(i),调整每个类的质心u(j),使J减少。
当J递减到最小时,u和c也同时收敛。
函数J是非凸函数,意味着我们不能保证取得的最小值是全局最小值。
K-means算法体现了EM迭代的思想,E步是估计隐含类别y的期望值,M步调整其他参数使得在给定类别y的情况下,极大似然估计P(x,y)能够达到极大值。
然后在其他参数确定的情况下,重新估计y,周而复始,直至收敛。
用K-means 解释就是开始不知道每个样本对应的隐含变量类别c(i),E步随便定一个c(i)给样本,然后是M步让P(x,c(i))最大(这里是让J最小),求出给定c的情况下,J最小时的质心u(j)(其他参数),质心确定后,重新E步估计样本的更好c(i)(归属到距离小的相似质心分类中,使J最小),c(i)得到重新调整。
重复到c没有调整。
算法是硬指定隐含类别变量给一个样本,而不是对每个类别赋予不同的概率。
总体思想是一个迭代优化过程,有目标函数,也有参数变量,只是多了个隐含变量类别c(i),确定其他参数质心u(j)估计隐含变量,再确定隐含变量估计其他参数,直至目标函数最优。
问题算法的缺点是:类型数目k需要首先较为合理的确定下来,没有在迭代过程中优化;算法会获得局部最优结果,需要好的选择初始的质心算法;小数量类别和孤立点的影响,需要考虑这些点的影响;计算数据相似度的距离算法和向量的特征维度,需要先确定下来。
图像处理之K图像处理之K-Means算法演示分类:图像处理 2013-04-20 17:49 84人阅读评论(0) 收藏举报一:数学原理K-Means算法的作者是MacQueen,基本的数学原理很容易理解,假设有一个像素数据集P。
我们要根据值不同将它分为两个基本的数据集合Cluster1, Cluster2,使用K-Means算法大致如下:假设两个Cluster的RGB值分别为112,225,244和23,34,99则像素集合中的像素点a(222,212,234), b(198,205,229), c(25,77,52),d(34,55,101)计算每个像素点与这两个cluster中心点的欧几里德距离,则像素点a, b属于前面一个cluster, c,d属于后面一个cluster。
然后在根据(222+198)/2, (212+205)/2, (234+52)/2更新cluster的RGB值,对后一个cluster做同样处理。
然后再计算每个像素点到cluster中心点的欧几里德距离。
最终值没有变化则得到分类Cluster点集合。
二:算法基本流程三:算法关键代码解析初始化cluster中心点代码如下:[java]view plaincopy?1.Random random = new Random();2.for (int i = 0; i < numOfCluster; i++)3.{4.int randomNumber1 = random.nextInt(width);5.int randomNumber2 = random.nextInt(height);6.index = randomNumber2 * width + randomNumber1;7.ClusterCenter cc = new ClusterCenter(randomNumber1, r andomNumber2, inPixels[index]);.setcIndex(i);9.clusterCenterList.add(cc);10.}初始化所有像素点代码如下:[java]view plaincopy?1.// create all cluster point2.for (int row = 0; row < height; ++row)3.{4.for (int col = 0; col < width; ++col)5.{6.index = row * width + col;7.int color = inPixels[index];8.pointList.add(new ClusterPoint(row, col, color));9.10.}11.}计算两个像素点之间欧几里德距离的代码如下:[java]view plaincopy?1.// int pa = (p.getPixelColor() >> 24) & 0xff;2.int pr = (p.getPixelColor() >> 16) & 0xff;3.int pg = (p.getPixelColor() >> 8) & 0xff;4.int pb = p.getPixelColor() & 0xff;5.// int ca = (c.getPixelColor() >> 24) & 0xff;6.int cr = (c.getPixelColor() >> 16) & 0xff;7.int cg = (c.getPixelColor() >> 8) & 0xff;8.int cb = c.getPixelColor() & 0xff;9.10.return Math.sqrt(Math.pow((pr - cr), 2.0) + Math.pow(( pg - cg), 2.0) + Math.pow((pb - cb), 2.0));重新计算Cluster中心点RGB值的代码如下:[java]view plaincopy?1.private double[] reCalculateClusterCenters() {2.3.// clear the points now4.for(int i=0; i<clusterCenterList.size(); i++)5.{6.clusterCenterList.get(i).setNumOfPoints(0);7.}8.9.// recalculate the sum and total of points for each cluster10.double[] redSums = new double[3];11.double[] greenSum = new double[3];12.double[] blueSum = new double[3];13.for(int i=0; i<pointList.size(); i++)14.{15.int cIndex = (int)pointList.get(i).getClusterIndex();16.clusterCenterList.get(cIndex).addPoints();17.int ta = (pointList.get(i).getPixelColor() >> 24) & 0xff;18.int tr = (pointList.get(i).getPixelColor() >> 16) & 0xff;19.int tg = (pointList.get(i).getPixelColor() >> 8) & 0xff;20.int tb = pointList.get(i).getPixelColor() & 0xff;21.ta = 255;22.redSums[cIndex] += tr;23.greenSum[cIndex] += tg;24.blueSum[cIndex] += tb;25.}26.27.double[] oldClusterCentersColors = new double[cluste rCenterList.size()];28.for(int i=0; i<clusterCenterList.size(); i++)29.{30.double sum = clusterCenterList.get(i).getNumOfPoint s();31.int cIndex = clusterCenterList.get(i).getcIndex();32.int red = (int)(greenSum[cIndex]/sum);33.int green = (int)(greenSum[cIndex]/sum);34.int blue = (int)(blueSum[cIndex]/sum);35.System.out.println("red = " + red + " green = " + gree n + " blue = " + blue);36.int clusterColor = (255 << 24) | (red << 16) | (green < < 8) | blue;37.clusterCenterList.get(i).setPixelColor(clusterColor);38.oldClusterCentersColors[i] = clusterColor;39.}40.41.return oldClusterCentersColors;42.}四:运行效果五:K-Means算法源代码[java]view plaincopy?1.package com.gloomyfish.segmentation.kmeans;2.3.import java.awt.image.BufferedImage;4.import java.util.ArrayList;5.import java.util.List;6.import java.util.Random;7.8.import com.gloomyfish.filter.study.AbstractBufferedImage Op;9.import com.gloomyfish.segmentation.fuzzycmeans.Cluste rPoint;10.11.public class KMeansProcessor extends AbstractBuffere dImageOp {12.private List<ClusterCenter> clusterCenterList;13.private List<ClusterPoint> pointList;14.15.private int numOfCluster;16.17.public KMeansProcessor(int clusters)18.{19.this.numOfCluster = clusters;20.pointList = new ArrayList<ClusterPoint>();21.this.clusterCenterList = new ArrayList<ClusterCenter>( );22.}23.24.@Override25.public BufferedImage filter(BufferedImage src, Buffere dImage dest) {26.// initialization the pixel data27.int width = src.getWidth();28.int height = src.getHeight();29.int[] inPixels = new int[width*height];30.src.getRGB( 0, 0, width, height, inPixels, 0, width );31.int index = 0;32.33.//Create random points to use a the cluster center34.Random random = new Random();35.for (int i = 0; i < numOfCluster; i++)36.{37.int randomNumber1 = random.nextInt(width);38.int randomNumber2 = random.nextInt(height);39.index = randomNumber2 * width + randomNumber1;40.ClusterCenter cc = new ClusterCenter(randomNumber 1, randomNumber2, inPixels[index]);.setcIndex(i);42.clusterCenterList.add(cc);43.}44.45.// create all cluster point46.for (int row = 0; row < height; ++row)47.{48.for (int col = 0; col < width; ++col)49.{50.index = row * width + col;51.int color = inPixels[index];52.pointList.add(new ClusterPoint(row, col, color));53.54.}55.}56.57.// initialize the clusters for each point58.double[] clusterDisValues = new double[clusterCenter List.size()];59.for(int i=0; i<pointList.size(); i++)60.{61.for(int j=0; j<clusterCenterList.size(); j++)62.{63.clusterDisValues[j] = calculateEuclideanDistance(point List.get(i), clusterCenterList.get(j));64.}65.pointList.get(i).setClusterIndex(getCloserCluster(cluste rDisValues));66.}67.68.// calculate the old summary69.// assign the points to cluster center70.// calculate the new cluster center71.// computation the delta value72.// stop condition--73.double[] oldClusterCenterColors = reCalculateClusterC enters();74.while(true)75.{76.stepClusters();77.double[] newClusterCenterColors = reCalculateCluster Centers();78.if(isStop(oldClusterCenterColors, newClusterCenterCol ors))79.{80.break;81.}82.else83.{84.oldClusterCenterColors = newClusterCenterColors;85.}86.}87.88.//update the result image89.dest = createCompatibleDestImage(src, null );90.index = 0;91.int[] outPixels = new int[width*height];92.for (int j = 0; j < pointList.size(); j++)93.{94.for (int i = 0; i < clusterCenterList.size(); i++)95.{96.ClusterPoint p = this.pointList.get(j);97.if (clusterCenterList.get(i).getcIndex() == p.getClusterI ndex())98.{99.int row = (int)p.getX(); // row100.int col = (int)p.getY(); // column101.index = row * width + col;102.outPixels[index] = clusterCenterList.get(i).getPixelColo r();103.}104.}105.}106.107.// fill the pixel data108.setRGB( dest, 0, 0, width, height, outPixels );109.return dest;110.}111.112.private boolean isStop(double[] oldClusterCenterColor s, double[] newClusterCenterColors) {113.for(int i=0; i<oldClusterCenterColors.length; i++)114.{115.System.out.println("cluster " + i + " old : " + oldCluster CenterColors[i] + ", new : " + newClusterCenterColors[i]);116.if(oldClusterCenterColors[i] != newClusterCenterColor s[i])117.{118.return false;119.}120.}121.System.out.println();122.return true;123.}124.125./**126.* update the cluster index by distance value127.*/128.private void stepClusters()129.{130.// initialize the clusters for each point131.double[] clusterDisValues = new double[clusterCenter List.size()];132.for(int i=0; i<pointList.size(); i++)133.{134.for(int j=0; j<clusterCenterList.size(); j++)135.{136.clusterDisValues[j] = calculateEuclideanDistance(point List.get(i), clusterCenterList.get(j));137.}138.pointList.get(i).setClusterIndex(getCloserCluster(cluste rDisValues));139.}140.141.}142.143./**144.* using cluster color of each point to update cluster ce nter color145.*146.* @return147.*/148.private double[] reCalculateClusterCenters() {149.150.// clear the points now151.for(int i=0; i<clusterCenterList.size(); i++)152.{153.clusterCenterList.get(i).setNumOfPoints(0);154.}155.156.// recalculate the sum and total of points for each clus ter157.double[] redSums = new double[3];158.double[] greenSum = new double[3];159.double[] blueSum = new double[3];160.for(int i=0; i<pointList.size(); i++)161.{162.int cIndex = (int)pointList.get(i).getClusterIndex();163.clusterCenterList.get(cIndex).addPoints();164.int ta = (pointList.get(i).getPixelColor() >> 24) & 0xff;165.int tr = (pointList.get(i).getPixelColor() >> 16) & 0xff;166.int tg = (pointList.get(i).getPixelColor() >> 8) & 0xff;167.int tb = pointList.get(i).getPixelColor() & 0xff;168.ta = 255;169.redSums[cIndex] += tr;170.greenSum[cIndex] += tg;171.blueSum[cIndex] += tb;172.}173.174.double[] oldClusterCentersColors = new double[cluste rCenterList.size()];175.for(int i=0; i<clusterCenterList.size(); i++)176.{177.double sum = clusterCenterList.get(i).getNumOfPoint s();178.int cIndex = clusterCenterList.get(i).getcIndex();179.int red = (int)(greenSum[cIndex]/sum);180.int green = (int)(greenSum[cIndex]/sum);181.int blue = (int)(blueSum[cIndex]/sum);182.System.out.println("red = " + red + " green = " + gree n + " blue = " + blue);183.int clusterColor = (255 << 24) | (red << 16) | (green < < 8) | blue;184.clusterCenterList.get(i).setPixelColor(clusterColor);185.oldClusterCentersColors[i] = clusterColor;186.}187.188.return oldClusterCentersColors;189.}190.191.192.193./**194.*195.* @param clusterDisValues196.* @return197.*/198.private double getCloserCluster(double[] clusterDisVal ues)199.{200.double min = clusterDisValues[0];201.int clusterIndex = 0;202.for(int i=0; i<clusterDisValues.length; i++)203.{204.if(min > clusterDisValues[i])205.{206.min = clusterDisValues[i];207.clusterIndex = i;208.}209.}210.return clusterIndex;211.}212.213./**214.*215.* @param point216.* @param cluster217.* @return distance value218.*/219.private double calculateEuclideanDistance(ClusterPoin t p, ClusterCenter c)220.{221.// int pa = (p.getPixelColor() >> 24) & 0xff;222.int pr = (p.getPixelColor() >> 16) & 0xff;223.int pg = (p.getPixelColor() >> 8) & 0xff;224.int pb = p.getPixelColor() & 0xff;225.// int ca = (c.getPixelColor() >> 24) & 0xff;226.int cr = (c.getPixelColor() >> 16) & 0xff;227.int cg = (c.getPixelColor() >> 8) & 0xff;228.int cb = c.getPixelColor() & 0xff;229.230.return Math.sqrt(Math.pow((pr - cr), 2.0) + Math.pow(( pg - cg), 2.0) + Math.pow((pb - cb), 2.0));231.}232.233.}转载请注明出自gloomyfish博客分享到:上一篇:JAVA实现自动打开URL对应的网页并保存为图片-不借助第三方API。
Journal of Image and Signal Processing 图像与信号处理, 2017, 6(1), 17-28 Published Online January 2017 in Hans. /journal/jisp /10.12677/jisp.2017.61003文章引用: 代贺, 滕奇志, 伦增珉. 岩石铸体薄片图像孔隙自动提取方法[J]. 图像与信号处理, 2017, 6(1): 17-28.The Automatic Extraction Method of the Pore of the Rock Casting Body ImageHe Dai 1, Qizhi Teng 1, Zengmin Lun 21Institute of Image Information, College of Electronics and Information Engineer, Sichuan University, Chengdu Sichuan 2State Key Laboratory of Shale Oil and Gas Enrichment Mechanisms and Effective Development, Research Institute of Petroleum Exploration and Production, Sinopec, BeijingReceived: Dec. 3rd , 2016; accepted: Dec. 17th , 2016; published: Dec. 22nd , 2016Copyright © 2017 by authors and Hans Publishers Inc. This work is licensed under the Creative Commons Attribution International License (CC BY)./licenses/by/4.0/AbstractTo solve the problems of time consuming and low efficiency in the traditional extraction of pore analysis from rock casting body image, an entirely new method of extraction of pore analysis from rock casting body image was proposed. Firstly, the rock casting body, which is produced by the pigmented resin or liquid glue, has a certain color, such as dark blue, light blue, dark red, light red and so on. The different characteristic regions have a certain concentration of H components by the analysis of the characteristic region. Secondly, using sample training, that is to say, the thre-shold value of the H components of the sample characteristic region is calculated. Finally, by using the threshold value of the H components, the same batch of rock casting body image can be ex-tracted directly. In this way, we can realize the automatic extraction of the pore of the rock casting body image. KeywordsRock Casting Body, H Components, Sample Training, Automatic Extraction岩石铸体薄片图像孔隙自动提取方法代 贺1,滕奇志1,伦增珉21四川大学电子信息学院,图像信息研究所,四川 成都2中国石油化工股份有限公司石油勘探开发研究院,页岩油气富集机理与有效开发国家重点实验室,北京代贺等收稿日期:2016年12月3日;录用日期:2016年12月17日;发布日期:2016年12月22日摘要针对传统岩石铸体薄片图像孔隙提取耗时、效率低的问题,提出了一种自动快速提取方法。
kmeans算法原理计算公式
Kmeans算法是一种聚类算法,它的核心思想是将数据集划分为K 个簇,其中每个簇的数据点都具有相似的特征。
这个算法的主要流程可以分为以下几个步骤:
1. 随机选择K个数据点作为聚类中心;
2. 将数据集中的每个数据点划分到与其距离最近的聚类中心所在的簇中;
3. 根据当前所有簇中的数据点,重新计算聚类中心的位置;
4. 重复第二步和第三步,直到聚类中心的位置不再发生变化或者达到预定的迭代次数。
Kmeans算法的核心在于如何计算距离和重新计算聚簇中心,具体方式如下:
1. 距离计算方式:
在Kmeans算法中,通常使用欧氏距离作为测度标准,即将两个数据点的n个特征之间的差值按平方和的方式相加,再将结果取平方根。
例如,对于一个数据点(P)和聚类中心(C),其距离计算公式为:
$D(P,C)=\sqrt{\sum_{i=1}^{n}(p_i-c_i)^2}$
其中,n表示数据点的特征数,$p_i$表示数据点P在第i个特征上的取值,$c_i$表示聚类中心C在第i个特征上的取值。
2. 重新计算聚簇中心方式:
在Kmeans算法中,重新计算聚簇中心时,通常使用簇内样本的均值作为新的聚簇中心位置。
例如,对于一个包含m个数据点的簇S,其聚簇中心的坐标为:
$C=\frac{1}{m}\sum_{i=1}^{m}p_i$
其中,$p_i$表示属于簇S的第i个数据点的坐标。
总的来说,Kmeans算法是一种简单但有效的聚类算法,它在解决实际问题中广泛应用。
自然语言处理算法 k-mk-means算法是一种常用的聚类算法,它可以将数据集划分为k个不同的簇。
本文将介绍k-means算法的基本原理、步骤和应用。
一、算法原理k-means算法的原理很简单,它通过迭代的方式将数据集划分为k 个簇,使得簇内的样本点相似度最高,而簇间的样本点相似度最低。
具体步骤如下:1. 初始化k个中心点,可以是随机选择或者根据经验选择。
2. 根据中心点,将数据集中的每个样本点分配给最近的中心点所在的簇。
3. 根据簇内的样本点,更新中心点的位置。
4. 重复步骤2和步骤3,直到中心点的位置不再发生变化或者达到最大迭代次数。
二、算法步骤k-means算法的步骤可以按照以下几个阶段进行描述:1. 初始化阶段:随机选择k个中心点作为初始值。
2. 分配阶段:将数据集中的每个样本点分配给离它最近的中心点所在的簇。
3. 更新阶段:根据簇内的样本点,更新中心点的位置。
4. 终止条件:当中心点的位置不再发生变化或者达到最大迭代次数时,停止算法。
三、算法应用k-means算法在实际应用中有很多场景,下面介绍几个常见的应用:1. 图像分割:将一幅图像分成若干个具有相似特征的区域,可以利用k-means算法将图像的像素点聚类成不同的颜色簇。
2. 文本聚类:将大量的文本数据划分为若干个簇,可以帮助用户更好地理解和分析文本数据。
3. 推荐系统:根据用户的历史行为和偏好,将用户划分到不同的簇,从而为用户推荐更加个性化的内容。
4. 无监督学习:k-means算法是一种无监督学习算法,可以在没有标记数据的情况下对数据进行聚类分析。
四、总结k-means算法是一种简单而有效的聚类算法,它通过迭代的方式将数据集划分为k个簇,使得簇内的样本点相似度最高,簇间的样本点相似度最低。
该算法在图像分割、文本聚类、推荐系统和无监督学习等领域都有广泛的应用。
通过理解k-means算法的原理和步骤,我们可以更好地应用它来解决实际问题。
孔隙率计算方法
孔隙率(porosity)是指岩石或土壤中空隙体积占总体积的百分比,用以衡量材料的疏松程度。
孔隙率的计算方法有以下几种:
1. 直接计算法:通过测量岩石样品的总体积和固体体积,用以下公式计算孔隙率:
孔隙率(n)=(总体积 - 固体体积)/ 总体积× 100%
2. 液体饱和法:将岩石样品浸入液体中,使空隙中的空气排出。
然后测量吸入液体的质量和液体密度,可以计算出空隙体积。
计算公式为:
孔隙率(n)=(吸入液体质量 / 液体密度)/ 总体积× 100% 3. 气体压力法:通过测量气体在不同压力下的体积变化,计算岩石样品的孔隙率。
该方法通常使用氦气,因为氦具有较小的分子直径,能有效地渗透到岩石的微小孔隙中。
4. 核磁共振法:利用核磁共振技术,通过测量岩石内孔隙中的氢核信号,计算岩石样品的孔隙率。
5. 微观分析法:利用电子显微镜等高分辨率成像技术,直接观察岩石样品的微观结构,对孔隙进行统计分析,得到孔隙率。
实际应用中会根据具体需求和条件选择合适的方法来计算孔隙率。
孔隙度计算公式
1 / 1 孔隙度计算公式:
1、声波时差计算公式:
Φt =(Δt –Δtma)/( Δtf -Δt ma)*1/Cp-Vsh*(Δtsh –Δt ma)/( Δtf-Δtma) 式中,Φt-声波计算的孔隙度,小数;
Δt ma 、Δt f-分别为岩石骨架声波时差、地层流体声波时差;620us/ft 、180us/ft ; V sh-地层泥质含量,小数;
Cp-声波压实校正系数;
Δt -目的层声波时差测井值。
2、密度求取孔隙度计算公式:
ΦD=(ρma –ρb )/( ρma –ρf) -Vsh*(ρma –ρsh)/( ρma –ρf)
式中,ΦD -密度孔隙度,小数;
ρm a、ρf-分别为岩石骨架密度值、地层流体密度值,g/cm 3;
DEN -目的层密度测井值,g/cm 3;
ρsh -泥岩密度值,g/cm 3;
Vsh -储层泥质含量,小数。
3、补偿中子计算公式:
ΦN=(CN-LCO R-0.5*Vsh*Nsh)*0.01
式中,ΦN —中子孔隙度,小数;
C N—目的层补偿中子测井值,%;
LCOR —岩石骨架中子值,%;
Vsh —目的层泥质含量,小数;
N sh —泥岩中子值,%。
孔隙度:利用中子—密度集合平均值计算
:Φ。
K-means岩石铸体图像分割及孔隙度的计算
摘要:为了准确获取储层的孔隙度进行地层解释并建立地质模型,设计了基于k means的岩石铸体图像分割及孔隙度的计算方法。
本设计基于k means聚类算法对彩色铸体薄片进行有效分割,并且在分割基础上结合形态学相关知识对图像进行更加精确识别,通过计算机判读二值图像中的孔隙面积与总图像面积比值得到孔
隙度值。
实验结果表明该方法可以取得好的聚类分割效果,并且使用其他检测方法和计算机判读2种方法求得的孔隙度基本一致,数值较吻合。
关键词:彩色分割; k means聚类; l*a*b*颜色空间;形态学处理;孔隙度
引言
储层孔隙度是进行油气预测、油气储量计算的重要参数之一,因此准确获取储层的孔隙度是进行地层解释和建立地质模型的基础
和关键\[1\]。
在众多求取孔隙度的方法中,岩石孔隙铸体薄片是研究岩石中真实孔隙大小分布的一种方法,在孔隙识别和求取、储层评价等方面具有直观、可视的技术优势。
它能清晰地显示出储层空间的微观结构特点及孔隙在储集层中的存在方式,揭示储层中油气分布与孔隙结构、构造之间的关系,为准确识别油气层提供了可靠依据。
1彩色图像聚类分割
彩色图像分割方法可分以下几类,聚类 (clustering)、区域分裂(region splitting)、分裂(split merge)和基于物理的方法(physics based segmentation)。
对于一幅彩色图像,可以利用聚类的方法根据颜色视觉上的不同将其划分为一系列相似的
部分,即实现了彩色图像分割\[23\]。
这种方法是根据图像中像素值,利用统计模式识别中的统计特性找出颜色空间的类,然后将
图像中每一像素标识到相应的类,每一类就对应一个区域。
2k means 聚类算法
2.1色彩空间转化
运用k means聚类对彩色图像进行分割,通常使用的颜色空间有rgb 颜色空间、hsi 颜色空间、l*a*b*颜色空间等。
各种颜色模型各有其特点,在rgb 空间中计算颜色的相似度,迭代计算量相对大,而且r,g,b的值存在很大的相关性,往往得不到好的聚类分割效果。
采用hsi,hls,hsv 颜色模型,需要转换颜色空间,空间转换计算相对复杂。
l*a*b*颜色空间是均匀颜色空间,也是彩色图像聚类中常采用的颜色模型,更符合人眼的视觉特性。
铸体薄片区域颜色非常复杂,难以用单一颜色进行描述,而l*a*b*颜色空间的a*和b*分量是对颜色范围的描述,其色彩空间要比rgb 色彩空间大,能够映射rgb 颜色空间所能描述的所有色彩信息\[4\],所以本文是在l*a*b*色彩空间进行彩色分割的。
由rgb到l*a*b*的转换公式为:l*=116(y/y0)1/3-16,y/y0>0.008 856
903.3(y/y0)1/3,y/y0≤0.008 856
a*=500[f(x/x0)-f(f(y/y0))]
b*=200[f(y/y0)-f(f(z/z0))]式中:f(t)=t1/3,t>0.008 856 7.787t+16/116,t≤0.008 856式中:x0,y0,z0是基准白色的
三原色值;l*与亮度相联系,a*与红色b*与黄色
蓝色相联系。
2.2k means算法的基本思路
k means算法是一种基于硬划分准则,使得每个对象只能划分到一个类中\[5\]。
其核心思想是通过不断迭代,在满足公式(1)的非线性目标函数最小化的条件下,把n个对象xj(j=1,…,n)构成的数据集分成k个类ci(i=1,2,…,k),从而使得类内对象具有较高的相似度,类间对象的相似度较低,生成的类尽可能紧凑和独立\[6\]。
j=∑ki=1ji=∑ki=1[∑j,xj∈ci‖xj-ci‖]
=∑ki=1[∑xj∈cid(xj,ci)\](1)其算法步骤如下:
(1)确定需要分类的类数k;
(2)从数据集xj中随机选取k个对象作为k个类ci的初始聚类中心ci(i=1,…,k);
(3)依次计算对象xj与这k个聚类中心ci的距离d(xj,,ci),并将对象划分到距离最小的类中;
(4)分别计算新生成的各个类ci中所有对象的均值,并作为新的聚类中心;
(5)计算非线性目标函数,若误差函数变化很小时,结束聚类,否则重复步骤(3)~(5)。
2.3实例分析及讨论
本次实验图像是选取铸体薄片照片资料中的3幅进行孔隙识别及孔隙度分析预测,利用k means算法分别对长庆油田塞9井砂岩(φ=5%)红色铸体薄片、重庆长寿卧龙河卧80井砂屑云岩(φ
=6.61%)蓝色铸体薄片和重庆长寿双龙双4井精细云岩(φ=14%)蓝色铸体薄片进行图像分割及孔隙度计算。
对其经过聚类分割识别的结果如图2所示。
从图2可以看出,k means算法可将铸体图像中的孔隙较好地识别出来,如此就可以很方便地在识别后对图像进行细化求得孔隙所占比例。
3基于图像分割的铸体图像孔隙度计算
岩石孔隙度即岩样中所有孔隙空间体积之和与该岩样体积的比
值\[7\]。
根据体视学理论,三维空间内特征点的特征可以用二维截面内特征点的特征值来表征;用图像分析方法对二维图像进行扫描,并对特征点的像素群进行检测,得到二维图像的特征值。
(1)图像增强。
经图像信息输入系统获取的源图像中通常都含有各种各样的噪声与畸变,会大大影响图像的质量。
因此,在对图像进行分析之前,必须先对图像质量进行改善。
通常,采用图像增
强的方法对图像进行改善\[8\]。
(2)去除噪声。
从图1可以看出,由于铸体图像背景很复杂,孔壁处多有炭沥青充填,经过分割后灰度增强图出现了某些染色炭沥青位于背景较亮的地方,因而显得很模糊,不利于直接进行计算。
为此,利用图像标记,根据各区块面积大小来消除图像背景中那些不一致的背景亮度,可以容易地将这些区域去除。
并且在去除小区域的同时,对目标区域无论是形状还是面积上都没有任何影响,可
以使得在后续特征提取和识别处理中,保证其精度和准确率,为成
功地识别目标打下了较好的基础。
图1不同类别铸体图像识别效果(3)填充目标。
为了图像识别更精确,调用imfill函数分别对4幅二值图像的孔隙进行填充,填充结果如图2所示,通过这些处理,就可以得到图像中的精细结构。
(4)求得孔隙度。
为了后续的二值图像中目标图像面积计算,需要调用bwperim函数连接断开的边缘像素,这样就可以统计到完整的目标个数。
本文通过计算目标面积与整个图像的面积的比值,求得孔隙度。
表1是计算机判读值与人工检测方法得到的值的对比表。
图2不同类别铸体图像填充图表1不同类别铸体图片计算机判读值与
人工检测法的孔隙度对比结果%
铸体类型计算机图像判读值人工检测值绝对误差相对误差砂岩4.169 250.830 80.199 2砂屑云岩7.858 86.611.248 80.158 9精细云岩13.806 8140.193 20.014
人工方法测得的孔隙度经验是宝贵的,但测试环境、设施等客观因素和人本身的主观因素,必然会引入人为随机误差。
而基于图像分割的铸体图像孔隙度经计算机判读相对稳定,其出现随机误差的可能性较小。
由表1对比结果可知,人工检测方法和计算机判读两种方法求得的孔隙度基本一致,数值较吻合。
实验过程中,还发现如果能够增加测试样本的数目,预测的准确性将会得到进一步提高。
4结语
(1)分割、计算结果表明,k means聚类分割算法计算简单,收敛速度快\[9\],能在彩色图像上取得好的聚类分割效果,为后续面积计算打下好的基础。
(2)基于图像分割的铸体图像孔隙度计算可以节约实验费用,减
少人的工作量并提高工作效率,具有较大的优越性。
(3) 实例表明,预测结果的准确性较高。
此方法可以作为一种储层孔隙度定量预测方法,由此预测出的储层孔隙度对于油气资源的勘探开发具有一定的参考价值[10\]。
参考文献
[1]赵明,杨光.岩石薄片显微图像技术在现场录井中的应用[j].录井工程,2006(3):19 3.
[2]coleman a, aderws h c. image segmentation by clustering \[j\]. proc. of ieee, 1979, 67(5): 773785.
[3]sarabi a, ggarwal j a. segmentation of chromatic image \[j\]. pattern recognition, 1981, 13(6): 417427.
[4]杜云海.基于l*a*b颜色空间的彩色等差线骨架线的提取[j].河南科学,2008,26(11):13241326.
[5]zalik k r. an efficient k means clustering algorithm \[j\].pattern recognition letters, 2008, 29(9): 13851391. [6]周萍.改进的图像分割遗传k j].海军工程大学学报,2009,21(3):8184.
[7]何更生.油层物理[m].北京:石油出版社,1994.
[8]阮秋琦.实用数字图像处理[m].北京:电子工业出版社,2001.
[9]郭庆锐,许建龙.基于颜色重心和k means的彩色图像聚类分割算法[j].浙江理工大学学报,2010(4):581584. [10]刘庆利,吴国平.铸体薄片分析法求取储存孔隙度[m].北京:测绘科学出版社,2009.。