为了根据颜色将组织学幻灯片分成几个层次,我修改了一些广泛分布的代码(1),这些代码可以通过OpenCV的社区获得。我们的染色程序标记不同类型的组织横断面不同颜色(B细胞为红色,巨噬细胞为棕色,背景珠心有蓝色)。
我只想选择图片中的品红色和棕色部分。

下面是我试图为洋红颜料制作一个面罩的尝试:
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)到目前为止,一种尝试和错误的方法产生了很差的结果:

有人能建议一种更聪明的方法在HSV颜色空间内进行阈值处理吗?我已经尽我最大的努力在以前的文章中寻找答案,但由于图像的性质,这些颜色范围似乎特别难定义。
参考文献:
更新:我找到了解决问题的有效方法。我使用一个简单的控制结构增加了“S”和“V”的下界,用一个简单的控制结构,输出每个测试图像的结果并选择最佳。我发现S和V的下界应该设为100和125。这种系统的试验和错误方法产生了更好的结果:

发布于 2015-08-27 12:28:36
我很高兴你找到了答案。
我将建议另一种可行的方法。不幸的是,我不精通python,所以您需要了解如何在python (它的基本代码)中编写代码。
如果我有在HSV阈值之后的第一张图像,我会使用形态运算来获取我想要的信息。
我可能会让它“关闭”,但如果它不起作用,我将首先扩张,然后填充,然后侵蚀的相同数额首先扩张。
可能在这第一步之后,您将需要删除您周围的小“噪音”斑点,您将得到图像。
在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)


请注意,我从“糟糕的”HSV分段开始。如果你尝试一个更好的,结果可能会改善。此外,发挥内核的大小为侵蚀和膨胀。
发布于 2015-09-02 03:21:52
通过反复试验(在"S“和"V”标度上上下递增),我发现我想要的颜色需要一个宽松的"S“和"V”值范围。我将避免分享我所使用的特定价值,因为我认为没有人会觉得这样的信息有用。
请注意,原来的代码共享工作良好,再次使用表示范围。
https://stackoverflow.com/questions/32238887
复制相似问题