我正在尝试编写一个程序,该程序将自动定位图像中的蛋白质,这最终将用于区分存在的两种不同高度的蛋白质。
背景顶部的白色区域是蛋白质所在的膜,存在的白色斑点是蛋白质。蛋白质有两个叶片,因此它们成对出现(实际上是一种蛋白质)。
我一直在斐济(Jython)写一个脚本试图找到蛋白质,这样我们就可以从当地背景中找出高度。到目前为止,这涉及应用自适应直方图均衡,然后用半径为10像素的滚球减去背景。之后,我一直在应用10像素×10像素的内核,并计算出5个中心像素的平均值,并将其除以内核4个边缘上的像素的平均值以得到比率。如果该比率高于某个值,那么它就是候选者。
我得到的输出是这个图像,除了一些包装和灵敏度(比率= 2.0)问题似乎没问题。我的问题是:
必要时
代码:http://pastebin.com/D45LNJCu
谢谢!
萨姆
答案 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()
这给出了这个:
答案 1 :(得分:3)
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),并直接从此线程加载图像。有关更多详细信息,请参阅注释。