python - 你会如何在 python 中计算水稻上重叠的谷物?
问题描述
鉴于提供的图像,您将如何使用 python 来计算米粒。如您所见,它们是重叠的。
任何帮助深表感谢。
我在下面尝试过这段代码,但失败了。我试过了: I = cv2.imread("name_of_file.jpg")
from sys import argv; from PIL import Image
# Init
I = Image.open(argv[1]); W, H = I.size; A = W * H
D = [sum(c) for c in I.getdata()]
Bh = [0] * H; Ch = [0] * H
Bv = [0] * W; Cv = [0] * W
# Flood-fill
Background = 3 * 255 + 1; S = [0]
while S:
i = S.pop(); c = D[i]
if c != Background:
D[i] = Background
Bh[i / W] += c; Ch[i / W] += 1
Bv[i % W] += c; Cv[i % W] += 1
S += [(i + o) % A for o in [1, -1, W, -W] if abs(D[(i + o) % A] - c) < 10]
# Eliminate "trapped" areas
for i in xrange(H): Bh[i] /= float(max(Ch[i], 1))
for i in xrange(W): Bv[i] /= float(max(Cv[i], 1))
for i in xrange(A):
a = (Bh[i / W] + Bv[i % W]) / 2
if D[i] >= a: D[i] = Background
# Estimate grain count
Foreground = -1; avg_grain_area = 3038.38; grain_count = 0
for i in xrange(A):
if Foreground < D[i] < Background:
S = [i]; area = 0
while S:
j = S.pop() % A
if Foreground < D[j] < Background:
D[j] = Foreground; area += 1
S += [j - 1, j + 1, j - W, j + W]
grain_count += int(round(area / avg_grain_area))
# Output
print grain_count
解决方案
这是一个相当复杂的图像分析问题。你可以训练一个神经网络来计算米粒数,但这并不容易。你需要很多已经数过米粒的图片来训练网络。
推荐阅读
- r - r 绘制时间序列 abline 奇怪的行为
- html - 从一个 div 定位特定链接
- python - Python 请求:Glassdoor.com 上的 403 错误
- excel - countif 2 列的总和大于另一个 2
- r - 在 R 中提取日期和时间
- sql - 来自年份和日期列的年龄 Netezza sql
- c++ - 为什么即使它是右值,我也可以在 begin() 上使用赋值运算符?
- ruby - 在 ruby 中,接收 *array 还是在方法内复制和排列更好?
- flutter - 如何更改抽屉的长按文本(颤动)
- python - Django REST API 和 Nuxt.js -(Nuxt 中的 CORS 错误)