在HSV颜色空间(Python,OpenCV,图像分析)中定义组织学图像蒙版的颜色范围:

时间:2015-08-27 00:38:33

标签: python opencv image-processing

为了根据颜色将组织切片分成几个层,我修改了一些广泛分布的代码(1),这些代码可以通过OpenCV社区获得。我们的染色程序标记具有不同颜色的不同细胞类型的组织横切面(B细胞是红色的,巨噬细胞是棕色的,背景nuceli具有蓝色)。

我有兴趣只选择图像的品红色和棕色部分。 raw_image

我试图为洋红色素制作面膜:

    import cv2
    import numpy as np

    def mask_builder(filename,hl,hh,sl,sh,vl,vh):
        #load image, convert to hsv
        bgr = cv2.imread(filename)
        hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)
        #set lower and upper bounds of range according to arguements
        lower_bound = np.array([hl,sl,vl],dtype=np.uint8)
        upper_bound = np.array([hh,sh,vh],dtype=np.uint8)
        return cv2.inRange(hsv, lower_bound,upper_bound)

    mask = mask_builder('sample 20 138 1.jpg', 170,180, 0,200, 0,230)
    cv2.imwrite('mask.jpg', mask)

到目前为止,试错法的结果很差: mask_output

任何人都可以建议一种更智能的方法来在HSV色彩空间内进行阈值处理吗?我已尽力在以前的帖子中搜索答案,但由于图像的性质,似乎这些颜色范围特别难以定义。

参考文献:

  1. 与色彩空间分离:http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html
  2. python opencv color tracking
  3. BGR分离:http://www.pyimagesearch.com/2014/08/04/opencv-python-color-detection/
  4. 更新: 我找到了解决问题的有效方法。我增加了S' S'和' V'通过使用简单的FOR控制结构定期间隔,输出每个测试图像的结果并选择最佳。我发现S和V的下界应设置为100和125.这种系统的反复试验方法产生了更好的结果: better_mask

2 个答案:

答案 0 :(得分:1)

我很高兴你找到了答案。

我会建议一种可行的替代方法。不幸的是我不熟悉python,所以你需要找到如何在python中编写代码(基本)。

如果我有HSV阈值后的第一张图像,我会使用morphological operations来获取我想要的信息。

我可能会先去"关闭"但是如果它不起作用我首先扩张,然后填充然后侵蚀首先扩张相同的量。

在第一步之后,您可能需要删除小的噪音"你周围的斑点,你会得到图像。

这就是在Matlab中的表现(主要是这样,你可以看到结果):

I=imread('http://i.stack.imgur.com/RlH4V.jpg');

I=I>230;                        % Create Black and white image (this is because in stackoverflow its a jpg)
ker=strel('square',3);          % Create a 3x3 square kernel

I1=imdilate(I,ker);             % Dilate
I2=imfill(I1,'holes');          % Close
I3=imerode(I2,ker);             % Erode

Ilabel=bwlabel(I3,8);            % Get a label per independent blob

% Get maximum area blob (you can do this with a for in python easily)
areas = regionprops(Ilabel,'Centroid','Area','PixelIdxList');
[~,index] = max([areas.Area]);   % Get the maximum area

Imask=Ilabel==index;             % Get the image with only the max area.



% Plot: This is just matlab code, no relevance

figure;
subplot(131)
title('Dialted')
imshow(I1);
subplot(132)
title('Closed')
imshow(I2);
subplot(133)
title('Eroded')
imshow(I3);


figure;
imshow(imread('http://i.stack.imgur.com/ZqrF9.jpg'))
hold on
h=imshow(bwperim(Imask));
set(h,'alphadata',Imask/2)

enter image description here enter image description here

请注意,我是从" bad" HSV细分。如果你尝试更好的结果可能会有所改善。另外,使用内核大小来进行侵蚀和扩张。

答案 1 :(得分:0)

通过反复试验(向下和向上递增“S”和“V”刻度),我发现我想要的颜色需要放宽“S”和“V”值的范围。我将不会分享我使用的特定值,因为我认为没有人会发现这些信息有用。

请注意,一旦使用了更具代表性的范围,原始代码共享就可以了。