我以前从未使用过计算机视觉的东西,并认为我可以使用 python 来分析凝胶电泳。如果您不熟悉该过程,这是一个视频,解释了正在发生的事情。
所以我从维基百科上拍了一张凝胶的照片,然后使用灰度滤镜,然后使用双边滤镜去除污迹和伪影,然后我使用 Otsu 滤镜分离出显着的条带。
import numpy as np
import matplotlib.pyplot as plt
from skimage import data, io
from skimage.filter import threshold_otsu, denoise_bilateral
from skimage.morphology import closing, square
from skimage.measure import regionprops
from skimage.color import label2rgb, rgb2gray
image = io.imread('http://upload.wikimedia.org/wikipedia/commons/6/60/Gel_electrophoresis_2.jpg')
#grayscaling
gray_image = rgb2gray(image)
# bilateral filtering
bilat=denoise_bilateral(gray_image, sigma_range=0.05, sigma_spatial=20)
# apply threshold Otsu
thresh = threshold_otsu(bilat)
bw = closing(bilat > thresh, square(1))
#print process
def show_images(images,titles=None):
"""Display a list of images"""
n_ims = len(images)
if titles is None: titles = ['(%d)' % i for i in range(1,n_ims + 1)]
fig = plt.figure()
n = 1
for image,title in zip(images,titles):
a = fig.add_subplot(1,n_ims,n)
if image.ndim == 2:
plt.gray()
plt.imshow(image)
a.set_title(title)
n += 1
fig.set_size_inches(np.array(fig.get_size_inches()) * n_ims)
plt.show()
#print data
show_images(images=[image, bilat, bw], titles=['Normal', 'Bilateral filter', 'Otsu Threshold'])
这是目前的结果
我遇到了 4 个问题:
使用 otsu 阈值会导致浅色波段的一些数据丢失是否有更好的方法获取波段数据?
有没有办法将每行的结果返回到 numpy/pandas 数组,其中波段显示在矩阵上?(即 0 表示无条带,1 表示轻条带,2 表示中等条带,3 表示重条带)这将允许检测与 DNA 梯(参考行)匹配的条带。
什么方法可以用来计算井到波段的距离。
如果照片不是直接拍摄的,我需要一种叫做图像注册的东西吗?如果是这样,我在哪里可以找到它
scikit-image
?
最后一件事我正在使用 python 3 和 scikit-image 的最后一个稳定版本,如果它重要的话。