使用Python图像处理对生物样品的照片进行分割,以提取感兴趣的圆形区域 - python

我在完成一些生物样本照片的分割时遇到问题,我试图通过图像处理来分析细菌的生长,因为理论上它应该起作用。这是我拥有的原始图像之一:

使用Python图像处理对生物样品的照片进行分割,以提取感兴趣的圆形区域 - python

我正在尝试对圆内的区域进行分割,以了解像素值随着时间的流逝如何变化。我一直在尝试很多技术,因为我对于分析这类样本还比较陌生,起初我使用的是opencv,但没有得到想要的结果,所以现在我对所有样本都使用scikit-image图像处理和分割技术。
这是我到目前为止的代码:

from skimage import morphology, exposure, io, filters
from scipy import ndimage as ndi
from skimage.color import rgb2gray, label2rgb
from skimage.filters import sobel, rank
import matplotlib.pyplot as plt
y1=400
y2=1600
x1=700
x2=1900
test_img = io.imread(folders_path+hour_tested[0]+'5.jpg')
roi_test = test_img[y1:y2, x1:x2,:]
gray_img = rgb2gray(roi_test)
denoised_img = rank.median(gray_img, morphology.disk(5))
val = filters.threshold_otsu(denoised_img)
mask = denoised_img > val
elevation_map=sobel(denoised_img)
segmentation = morphology.watershed(elevation_map, mask=mask)
labeled_bio, num_seg = ndi.label(segmentation)
image_label_overlay = label2rgb(labeled_bio, image=gray_img)
plt.imshow(image_label_overlay)
plt.show()

在最后一行,我将按照不同的颜色对样品区域进行分割,并在一个标签中得到要分析的部分,因为我现在不知道如何继续,或者至少不知道如何看到该标签,然后创建一个面具。

我还分享了带有标签的图像,以供任何人查看,并可能在下一步中为我提供帮助,我觉得或者我真的很接近将自己感兴趣的领域细分,或者真的很困惑。

好吧,这是样本的标签图像:

使用Python图像处理对生物样品的照片进行分割,以提取感兴趣的圆形区域 - python

参考方案

这是一种使用简单图像处理技术的方法

获取二进制图像。加载图像,转换为灰度,然后使用Otsu的阈值获得二进制图像
执行形态学操作。我们创建一个椭圆形的核,然后执行变形以填充轮廓
隔离感兴趣的区域。我们找到轮廓并使用轮廓逼近+轮廓区域进行过滤。隔离轮廓后,找到最小的封闭圆以获得理想的圆,然后将其绘制到空白蒙版上。获得完美圆的想法来自how to modify a mask to make a perfect circle
隔离ROI。我们在蒙版上找到边界矩形ROI,然后使用Numpy切片进行裁剪
按位求和。最后,我们按位运算,然后提取两个ROI

这是每个步骤的可视化:

输入图像

二进制图像

变形关闭

孤立的关注区域以绿色突出显示,填充轮廓绘制在空白蒙版上

孤立的投资回报率

按位求和(两种版本,一种带有黑色背景,另一种带有白色背景,具体取决于您想要的)

import cv2
import numpy as np

# Load image, create blank mask, grayscale, Otsu's threshold
image = cv2.imread('1.jpg')
original = image.copy()
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Morph close
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=5)

# Find contours and filter using contour area + contour approximation
# Determine perfect circle contour then draw onto blank mask
cnts = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.04 * peri, True)
    area = cv2.contourArea(c)
    if len(approx) > 4 and area > 10000 and area < 500000:
        ((x, y), r) = cv2.minEnclosingCircle(c)
        cv2.circle(mask, (int(x), int(y)), int(r), (255, 255, 255), -1)
        cv2.circle(image, (int(x), int(y)), int(r), (36, 255, 12), 3)

# Extract ROI
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
x,y,w,h = cv2.boundingRect(mask)
mask_ROI = mask[y:y+h, x:x+w]
image_ROI = original[y:y+h, x:x+w]

# Bitwise-and for result
result = cv2.bitwise_and(image_ROI, image_ROI, mask=mask_ROI)
result[mask_ROI==0] = (255,255,255) # Color background white

cv2.imwrite('close.png', close)
cv2.imwrite('thresh.png', thresh)
cv2.imwrite('image.png', image)
cv2.imwrite('mask.png', mask)
cv2.imwrite('result.png', result)
cv2.waitKey()

注意:确定感兴趣的圆形区域的另一种方法是使用已经实现为cv2.HoughCircles()的霍夫圆变换,但是参数很多,因此它可能不是最实用的方法。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

有没有一种方法可以有效地矢量化图像上的Tensorflow操作? - python

Tensorflow有大量的变换,可以应用于表示图像([高度,宽度,深度])(例如tf.image.rot90()或tf.image.random_flip_left_right())的3D张量。我知道它们应与队列一起使用,因此它们只能在一个图像上运行。但是,是否有一种方法可以对操作进行矢量化处理,以将4D张量([batch_size,height,widt…

cv2.resize与Python:插值方法到底是什么? - python

给定一个表示图像的9x9矩阵(其条目为[R,G,B]),我想创建一个尺寸为3x3的新的调整大小的图像,每个条目的计算方式如下:将9x9矩阵分成9个3x3矩阵块计算每个3x3矩阵块的均值(按分量)使用这些方法创建3x3图像。到目前为止,我已经在Python 3.6中使用了cv2库image_blurred = cv2.resize(original_image…

将numpy数组图像转换为与request.get相同的格式 - python

我有一个http端点,希望我以这种格式发送图像:url = 'https://example_image_url.jpg' img_bytes = requests.get(url).content endpoint.predict(img_bytes) 如果我有一个numpy数组格式的图像,如何将其转换为与上述img_bytes格式相同…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…