如何计算图像中非连续形状内的区域?

问题描述 投票:2回答:2

我有一系列有趣的细胞生长图像,我的公司正在尝试以编程方式量化这道菜中含有多少细胞和多少细胞。

我在下面列出了一张图片作为我的例子。任何封闭区域都是细胞生长,而任何其他非黑色区域则不是。

我尝试了一些不同的滤镜和一个填充算法来搜索细胞生长区域,但是在图像处理方面经验不足并没有取得多大成功。这是我从互联网上整理的一些代码来计算黑色像素的数量。然而,它是如此缓慢,我认为最好问你们。

image = Image.open("Images/24Hour/HB15_2.jpg")
image = image.getdata()

def is_black_enough(pixel):
    r, g, b = pixel
    return r < 10 and g < 10 and b < 10
w, h = np.asarray(image).shape
black_pixels = 0
for pixel in image:
    if is_black_enough(pixel)==True:
        black_pixels+=1
        print(black_pixels)
black_pixels/(w*h)

enter image description here

编辑

我用Google搜索并管理了几件事。首先,我有一个黑色像素的高效计算器。其次,我有一个细胞生长区域的开始计算器。有谁知道如何计算下面的封闭黄色边界或完全不同的解决方案?

img = Image.open("Images/24Hour/HB15_2.jpg")
img = img.convert('L')
img = np.asarray(img)
img = 1 * (img < 130) * (img > 90)
m,n = img.shape
plt.figure(figsize=(20,10))
plt.imshow(img)

enter image description here

python image opencv image-processing python-imaging-library
2个回答
1
投票

由于细胞生长是非连续形状,我们不能使用形状检测器。因此,另一个选择可能是对细胞进行斑点检测,然后找到该区域以获得定量数字。为了检测斑点,我们首先将图像转换为灰度并使用Canny edge detection来帮助我们分离细胞生长。

enter image description here

接下来,我们可以使用cv2.contourArea()抓住所有轮廓并找到每个轮廓的区域。我们添加每个轮廓区域以获得总面积。这是一个简单的方法,并不完美,但它抓住了大部分的blob。

enter image description here

import cv2
import numpy

def grab_contours(cnts):
    # OpenCV v2.4, v4-official
    if len(cnts) == 2:
        return cnts[0]
    # OpenCV v3
    elif len(cnts) == 3:
        return cnts[1]

image = cv2.imread("test.png")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(gray, 120, 255, 1)
cv2.imshow("canny", edged)

cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = grab_contours(cnts)

contour_image = edged.copy()
area = 0

for c in cnts:
    area += cv2.contourArea(c) 
    cv2.drawContours(contour_image,[c], 0, (100,5,10), 3)

print(area)
cv2.putText(contour_image, str(area), (50,50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (100,255,100), 2)
cv2.imshow("area", contour_image)
cv2.waitKey(0)

2
投票

一种简单的方法是将所有黄色变成白色,将所有紫色变成黑色。然后得到图像的平均值并乘以宽度和高度。这将计算黄色像素的数量(即,区域)。也许您应该将图像保存为灰度或二进制,而不是将其着色。例如,这是一种使用ImageMagick的方法。但是你可以用Python Wand,OpenCV或scipy(skimage)做同样的事情。

请注意,我已下载您的图片并将其裁剪以删除其他标记。所以你需要使用你的完整图像。

enter image description here

convert img_sub.png -alpha off -fuzz 10% -fill black -opaque "rgb(68,1,84)" -fill white +opaque black +write binary.png -format "%[fx:mean*w*h]\n" info:

58464

这是保存的二进制图像。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.