Scikit图像颜色过滤并将图像部分更改为数组

时间:2014-02-09 06:28:19

标签: python numpy scikit-image optical-mark-recognition

我想用scikit-image做一些光学标记识别。我正在寻找2个功能

假设我的图片看起来像这样:OMR

我检测它的方法是使用过滤器来清理图像: (即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中可用。

1 个答案:

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

Color dot detection