我想用scikit-image做一些光学标记识别。我正在寻找2个功能
假设我的图片看起来像这样:
我检测它的方法是使用过滤器来清理图像:
(即filter
模块中的噪声斑点的双边和高斯滤波)
然后我会在color
模块中使用灰度缩放
第三,我会在filter
模块中使用canny边缘检测器
我试图找出我用什么来按颜色过滤细胞,这样我就可以将红色和蓝色分开?
我猜测有一些Hues,饱和度,亮度或RGB功能可用于过滤掉特定颜色或某些可用于k-means
来自scikit learn
的过滤数据的功能
其次是如何将此图像转换为numpy数组/ pandas数据帧,如下所示:
[[1,2,0,2,0]
[0,1,1,0,1]
[0,0,1,2,0]]
其中红色为1,蓝色为2,白色为0.我看到有些人放下了一条线,但不知道它叫什么或是否在sk-image中可用。
答案 0 :(得分:6)
以下代码使用了scikit-image的峰值检测器,应用于图像与纯红色和蓝色值之间计算的距离图上:
from skimage import io, color, img_as_float
from skimage.feature import corner_peaks, plot_matches
import matplotlib.pyplot as plt
import numpy as np
image = img_as_float(io.imread('colordots.jpg'))
black_mask = color.rgb2gray(image) < 0.1
distance_red = color.rgb2gray(1 - np.abs(image - (1, 0, 0)))
distance_blue = color.rgb2gray(1 - np.abs(image - (0, 0, 1)))
distance_red[black_mask] = 0
distance_blue[black_mask] = 0
coords_red = corner_peaks(distance_red, threshold_rel=0.9, min_distance=50)
coords_blue = corner_peaks(distance_blue, threshold_rel=0.9, min_distance=50)
f, ((ax0, ax1), (ax2, ax3)) = plt.subplots(2, 2, figsize=(15, 10))
ax0.imshow(image)
ax0.set_title('Input image')
ax1.imshow(image)
ax1.set_title('Marker locations')
ax1.plot(coords_red[:, 1], coords_red[:, 0], 'ro')
ax1.plot(coords_blue[:, 1], coords_blue[:, 0], 'bo')
ax1.axis('image')
ax2.imshow(distance_red, interpolation='nearest', cmap='gray')
ax2.set_title('Distance to pure red')
ax3.imshow(distance_blue, interpolation='nearest', cmap='gray')
ax3.set_title('Distance to pure blue')
plt.show()