图像分析:在图像中查找蛋白质

时间:2014-10-23 10:37:18

标签: python image-processing imagej

我正在尝试编写一个程序,该程序将自动定位图像中的蛋白质,这最终将用于区分存在的两种不同高度的蛋白质。 proteins in a membrane

背景顶部的白色区域是蛋白质所在的膜,存在的白色斑点是蛋白质。蛋白质有两个叶片,因此它们成对出现(实际上是一种蛋白质)。

我一直在斐济(Jython)写一个脚本试图找到蛋白质,这样我们就可以从当地背景中找出高度。到目前为止,这涉及应用自适应直方图均衡,然后用半径为10像素的滚球减去背景。之后,我一直在应用10像素×10像素的内核,并计算出5个中心像素的平均值,并将其除以内核4个边缘上的像素的平均值以得到比率。如果该比率高于某个值,那么它就是候选者。

我得到的输出是这个图像,除了一些包装和灵敏度(比率= 2.0)问题似乎没问题。我的问题是:

  1. 这是一种合理的方法还是有明显更好的方法呢?
  2. 你能从这里建议吗?我现在有点陷入困境,并不确定如何继续。
  3. enter image description here

    必要时

    代码:http://pastebin.com/D45LNJCu

    谢谢!

    萨姆

2 个答案:

答案 0 :(得分:3)

如何开始更简单并使用Harris-point方法并检测局部最大值。例如

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()

这给出了这个:

enter image description here

答案 1 :(得分:3)

ImageJ“Find maxima”也有类似之处。

ImageJ Find Maxima

这是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('http://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),并直接从此线程加载图像。有关更多详细信息,请参阅注释。