- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在研究一个问题,即使用图片构建分类器来预测结果。基本上,我在图片上有对象(一个或多个),我想识别它们。因为我可以拥有一个或多个对象(并不总是相同的),所以我首先希望能够计算出我的图片上有多少个对象。我不想运行任何机器学习算法,我希望有某种方法可以尽快完成。
运行 k-means(使用颜色)使我能够将图片分成 2 个颜色组,这已经很好地分离了背景和对象。从这张图片中,我想找到一种方法来计算所有不同的“区域”。我尝试使用颜色和位置运行 k-means 以尝试一步完成所有操作,但效果不是很好,因为向 kmeans 添加位置会降低其结果。
这里是图片的示例,一旦用 kmeans 将它分成两个颜色区域:
显然这里有 5 个对象和 1 个背景。或者,6 个不同的区域。
我想做的是在该图片上运行一个算法,它会告诉我那个数字。我不熟悉图像处理,所以我想不出一种快速有效的方法。我想到的一种解决方案是从对象类 中取出一个像素并测试相邻像素是否属于同一类或实际上是背景类 的一部分。但这将是一个痛苦而漫长的做事方式。
我已经尝试过 blob 识别,但看起来这个算法并不适合我的需要。
我很想知道如何解决这类问题。我不介意自己编写算法代码,但我也很想知道是否有 R 包可以轻松实现这种事情。
我希望一切都足够清楚。非常感谢您!
最佳答案
更新 找到一个link to an implementation of bwlabel in the R image processing toolbox .所以以下可能不是必需的,但创建它很有趣 :-) 你应该看看那个包,因为它有其他对象分割算法(即分水岭),可能比你的 k-means 聚类的第一步更好.
如果您的分割在背景和对象之间正确标记,并且至少有一个背景像素分隔不同对象之间的边界,那么您可能需要在 R 中实现 matlab 的 bwlabel
函数。对此的解释见this SO question/answer
下面是一个不执行标记的实现(尽管可以很容易地采用它来这样做):
find.contiguous <- function(img, x, bg) {
## we need to deal with a single (row,col) matrix index
## versus a collection of them in a two column matrix separately.
if (length(x) > 2) {
lbl <- img[x][1]
img[x] <- bg
xc <- x[,1]
yc <- x[,2]
} else {
lbl <- img[x[1],x[2]]
img[x[1],x[2]] <- bg
xc <- x[1]
yc <- x[2]
}
## find all neighbors of x
x <- rbind(cbind(xc-1, yc-1),
cbind(xc , yc-1),
cbind(xc+1, yc-1),
cbind(xc-1, yc),
cbind(xc+1, yc),
cbind(xc-1, yc+1),
cbind(xc , yc+1),
cbind(xc+1, yc+1))
## that have the same label as the original x
x <- x[img[x] == lbl,]
## if there is none, we stop and return the updated image
if (length(x)==0) return(img);
## otherwise, we call this function recursively
find.contiguous(img,x,bg)
}
find.contiguous
是一个递归函数,其中对于它接收的每个调用:
img
的工作副本。img
中的对象的像素(矩阵)索引 x
(行,列)的集合。bg
find.contiguous
然后继续:
img
中 x
处的所有像素设置为 bg
颜色。这标志着我们已经访问了像素。x
中所有与 x
具有相同标签(值)的相邻像素。这会增加同一对象的区域。请注意,由于 x
不一定是单个像素,因此 x
会几何增长,因此,事实上,此功能并非无懈可击。从对应于对象的单个像素开始,调用 find.contiguous
将扩大区域以包含对象的所有像素并返回更新后的图像,其中对象被背景替换.然后可以在循环中重复此过程,直到图像中不再有物体,因此能够生成计数。
为了说明,我假设您的二进制图像是一个名为 img
的 matrix
:
## set the background pixel value
bg <- 0
## set the object pixel value
obj <- 1
## pad image so that the edge is background, this is necessary because
## the neighborhood generated in find.contiguous must lie strictly within
## the image
tmp <- matrix(bg,nrow=nrow(img)+2,ncol=ncol(img)+2)
tmp[2:(nrow(img)+1),2:(ncol(img)+1)] <- img
img <- tmp
## initialize the count to zero
count <- 0
## get all pixel coordinates that are objects
x <- which(img==obj, arr.ind=TRUE)
## loop until there are no more pixels that are objects
while (length(x) > 0) {
## choose a single (e.g., first) pixel location. This belongs to the current
## object that we will grow and remove from the image using find.contiguous
if (length(x) > 2) {
x <- x[1,]
}
## increment the count
count <- count + 1
## make the call to remove the object from img
img <- find.contiguous(img, x, bg)
## find the remaining pixel locations belonging to objects
x <- which(img==obj, arr.ind=TRUE)
}
您的答案在 count
中。在来自上一个链接的样本数据上运行:
img <- as.matrix(read.table(text="
0 0 0 0 0 1 1 1 0 0
0 1 0 1 0 0 1 1 0 0
0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 1 1
0 0 1 1 1 1 0 0 1 1", header=FALSE))
我们得到:
print(paste("number of objects: ",count))
##[1] "number of objects: 4"
关于R:计算图片中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38959470/
SQL 和一般开发的新手,我有一个表(COUNTRIES),其中包含字段(INDEX、NAME、POPULATION、AREA) 通常我添加一个客户端(Delphi)计算字段(DENSITY)和 On
我想使用 calc(100%-100px),但在我的 demo 中不起作用由于高度只接受像素,因此如何将此百分比值转换为像素。 最佳答案 以下将为您提供高度: $(window).height();
我正在尝试在 MySQL 中添加列并动态填充其他列。 例如我有一张表“数字”并具有第 1 列、第 2 列、第 3 列,这些总数应填充在第 4 列中 最佳答案 除非我误解了你的问题,否则你不只是在寻找:
我想返回简单计算的结果,但我不确定如何执行此操作。我的表格如下: SELECT COUNT(fb.engineer_id) AS `total_feedback`, SUM(fb.ra
我一直在尝试做这个程序,但我被卡住了,我仍然是一个初学者,任何帮助将不胜感激。我需要程序来做 打印一个 10 X 10 的表格,其中表格中的每个条目都是行号和列号的总和 包含一个累加器,用于计算所有表
这个计算背后一定有一些逻辑。但我无法得到它。普通数学不会导致这种行为。谁能帮我解释一下原因 printf ("float %f\n", 2/7 * 100.0); 结果打印 1.000000 为什么会
我想计算从 0 到 (n)^{1/2} - 1 的数字的 AND每个数字从 0 到 (n)^{1/2} - 1 .我想在 O(n) 中执行此操作时间,不能使用 XOR、OR、AND 运算。 具体来说,
如何在 Excel 中将公式放入自定义数字格式?例如(出于说明目的随机示例), 假设我有以下数据: 输入 输出 在不编辑单元格中的实际数据的情况下,我想显示单元格中的值除以 2,并保留两位小数: 有没
每次我在 Flutter 应用程序中调用计算()时,我都会看到内存泄漏,据我所知,这基本上只是一种生成隔离的便捷方法。我的应用程序内存占用增加并且在 GC 之后永远不会减少。 我已将我的代码简化为仅调
我有数字特征观察 V1通过 V12用于目标变量 Wavelength .我想计算 Vx 之间的 RMSE列。数据格式如下。 每个变量“Vx”以 5 分钟的间隔进行测量。我想计算所有 Vx 变量的观测值
我正在寻找一种使用 C 语言计算文件中未知字符数的简单方法。谢谢你的帮助 最佳答案 POSIX 方式(可能是您想要的方式): off_t get_file_length( FILE *file ) {
我正在使用 Postgres,并且我正试图围绕如何在连续日期跨度中得出第一个开始日期的问题进行思考。例如 :- ID | Start Date | End Date =================
我有一个订单表格,我在其中使用 jQuery 计算插件来汇总总数。 此求和工作正常,但生成的“总和”存在问题。总之,我希望用逗号替换任何点。 代码的基础是; function ($this) {
我在使用 double 变量计算简单算术方程时遇到问题。 我有一个具有 double 属性 Value 的组件,我将此属性设置为 100。 然后我做一个简单的减法来检查这个值是否真的是 100: va
我在这里看到了一些关于 CRC 32 计算的其他问题。但没有一个让我满意,因此是这样。 openssl 库是否有任何用于计算 CRC32 的 api 支持?我已经在为 SHA1 使用 openssl,
当我在PHP日期计算中遇到问题时,我感到惊讶。 $add = '- 30 days'; echo date('Y-m-01', strtotime($add)); // result is 2017-
我正在使用 javascript 进行练习,我编写了这个脚本来计算 2 个变量的总和,然后在第三个方程中使用这个总和!关于如何完成这项工作的任何想法都将非常有用! First Number:
我有一个来自EAC的提示单和一个包含完整专辑的FLAC文件。 我正在尝试制作一些python脚本来播放文件,因为我需要能够设置在flac文件中开始的位置。 如何从CueSheet格式MM:SS:FF转
这个问题已经有答案了: Adding two numbers concatenates them instead of calculating the sum (24 个回答) 已关闭去年。 我有一个
4000 我需要上面字段 name="quantity" 和 id="price" 中的值,并使用 javascript 函数进行计算,并将其显示在字段 id= 中仅当我单击计算按钮时才显示“总
我是一名优秀的程序员,十分优秀!