如何使用python获取连接组件中标记为map的内核中的唯一区域数?

时间:2016-11-20 10:52:25

标签: python image-processing

我想获得标记为map的连通组件中的区域数量 例如:

[Image value]  
00011100022200   
00011000002220  
00000033300220  
44000033000020  
44000000000000  

如果内核大小是3x3,我想在相同大小的2D数组中获得唯一值的数量。

例如,新的2D数组具有以下值:

newarray[3,3]=2  
newarray[2,4]=1  
newarray[2,2]=0  

我正在使用Python,任何想法?

1 个答案:

答案 0 :(得分:0)

这可以使用numpy来完成,101 200 000 具有很好的语法。

假设我们有输入数据:

import numpy as np
data = np.array([[1,0,1],[2,0,0],[0,0,0]])
submatrix = data[0:2,0:2]

你可以在numpy中定义它并检索左上角的2x2子矩阵:

values = list(submatrix.flatten())
without_zeros = list(filter(None, values))
unique_values_not_zero = set(without_zeros)

您的内核函数似乎是"内核区域"中唯一值的数量不等于零。这可以使用标准的python函数计算:

apply_kernel_to_matrix

从这里开始,你应该能够再次继续。以下列出了现在仍需要实施的未解决问题:

  • 您需要实现一个循环,将上面的计算应用于整个矩阵中的每个子矩阵(它将是两个嵌套的循环)。
  • 你需要处理边界。通常,我认为在图像处理中,他们希望结果矩阵与输入矩阵具有相同的大小。因此,您必须找到一种方法来处理内核与矩阵中未定义的区域重叠的区域。例如。当你想在你的例子中设置字段0x0的值时。
  • 您可以创建两个不同的函数unique_values_kernelapply_kernel_to_matrix,以便稍后可以添加更多内核,稍后再重用package org.test.scala import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.streaming._ import org.apache.spark.SparkContext._ import org.apache.spark.streaming.twitter._ object twitterAnalysis { val conf = new SparkConf().setAppName("twitter sentiment analysis") val sc = new SparkContext(conf) def main(args: Array[String]): Unit = { sc.setLogLevel("WARN") val filters = args for(i <- filters) { println("recieved arg" + i) } /* setting up the Twitter4j library parameters */ System.setProperty("twitter4j.oauth.consumerKey", mykey) System.setProperty("twitter4j.oauth.consumerSecret", mysecret) System.setProperty("twitter4j.oauth.accessToken", acesskey) System.setProperty("twitter4j.oauth.accessTokenSecret", accesssecret) val ssc = new StreamingContext(sc,Seconds(5)) val stream = TwitterUtils.createStream(ssc,None,filters) //stream.print() val hashtags = stream.flatMap( status => status.getText.split(" ").filter( _.startsWith("#")) ) println("here are the elements of HashTags") // hashtags.print() val topcounts60 = hashtags.map((_,1)).reduceByKeyAndWindow(_ + _ ,Seconds(60)) .map { case (topic,count) => (count,topic) } .transform(_.sortByKey(false)) topcounts60.foreachRDD(rdd => { val toplist = rdd.take(10) println("\n Popular topics in last 10 seconds ( %s total) ".format(rdd.count())) toplist.foreach { case (count,tag) => println("%s (%s tweets)".format(tag, count)) } }) ssc.start ssc.awaitTermination } } 函数。阅读lambda函数。