图像分析:在图像中查找蛋白质
我正在尝试写一个程序,自动在图片中找到蛋白质,这个程序最终会用来区分两种不同高度的蛋白质。
背景上方的白色区域是一个膜,蛋白质就坐落在这个膜上,而那些白色的块状物就是蛋白质。蛋白质有两个部分,所以它们成对出现(实际上是一个蛋白质)。
我在Fiji(Jython)中写了一个脚本,试图找到这些蛋白质,这样我们就可以根据周围的背景来计算它们的高度。目前的做法是先应用自适应直方图均衡,然后用半径为10像素的滚动球来减去背景。接下来,我使用了一种10像素乘10像素的核,计算中心5个像素的平均值,并将其与核边缘4个像素的平均值进行比较,得到一个比值。如果这个比值超过某个值,那么它就被认为是一个候选者。
我得到的输出是这张图片,除了有一些包裹和灵敏度(比值=2.0)的问题,整体看起来还不错。我的问题是:
- 这个方法合理吗?还是有明显更好的做法?
- 你能建议我接下来该怎么做吗?我现在有点卡住,不太确定该如何继续。
如果需要代码:http://pastebin.com/D45LNJCu
谢谢!
Sam
2 个回答
3
ImageJ的“查找最大值”功能也有类似的作用。
这里是Jython代码
from ij import ImagePlus, IJ, Prefs
from ij.plugin import RGBStackMerge
from ij.process import ImageProcessor, ImageConverter
from ij.plugin.filter import Binary, MaximumFinder
from jarray import array
# define background is black (0)
Prefs.blackBackground = True
# find maxima
#imp = IJ.getImage()
imp = ImagePlus('https://i.stack.imgur.com/Q766c.png')
ImageConverter(imp).convertToGray8()
ip = imp.getProcessor()
segip = MaximumFinder().findMaxima( ip, 10, 200, MaximumFinder.SINGLE_POINTS , False, False)
# display detection result
binner = Binary()
binner.setup("dilate", None)
binner.run(segip)
segimp = ImagePlus("seg", segip)
mergeimp = RGBStackMerge.mergeChannels(array([segimp, imp, None, None, None, None, None], ImagePlus), True)
mergeimp.show()
更新:更新了代码,现在可以处理PNG格式的图片(RGB),并且可以直接从这个帖子加载图片。更多细节请查看评论。
3
我们可以先从简单的开始,使用哈里斯角点的方法来检测局部最大值。比如说:
import numpy as np
import Image
from scipy import ndimage
import matplotlib.pyplot as plt
roi = 2.5
peak_threshold = 120
im = Image.open('Q766c.png');
image = im.copy()
size = 2 * roi + 1
image_max = ndimage.maximum_filter(image, size=size, mode='constant')
mask = (image == image_max)
image *= mask
# Remove the image borders
image[:size] = 0
image[-size:] = 0
image[:, :size] = 0
image[:, -size:] = 0
# Find peaks
image_t = (image > peak_threshold) * 1
# get coordinates of peaks
f = np.transpose(image_t.nonzero())
# Show
img = plt.imshow(np.asarray(im))
plt.plot(f[:, 1], f[:, 0], 'o', markeredgewidth=0.45, markeredgecolor='b', markerfacecolor='None')
plt.axis('off')
plt.savefig('local_max.png', format='png', bbox_inches='tight')
plt.show()
这样做会得到这个结果: