为了根据颜色将组织切片分成几个层,我修改了一些广泛分布的代码(1),这些代码可以通过OpenCV社区获得。我们的染色程序标记具有不同颜色的不同细胞类型的组织横切面(B细胞是红色的,巨噬细胞是棕色的,背景nuceli具有蓝色)。
我试图为洋红色素制作面膜:
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' S'和' V'通过使用简单的FOR控制结构定期间隔,输出每个测试图像的结果并选择最佳。我发现S和V的下界应设置为100和125.这种系统的反复试验方法产生了更好的结果:
答案 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)
请注意,我是从" bad" HSV细分。如果你尝试更好的结果可能会有所改善。另外,使用内核大小来进行侵蚀和扩张。
答案 1 :(得分:0)
通过反复试验(向下和向上递增“S”和“V”刻度),我发现我想要的颜色需要放宽“S”和“V”值的范围。我将不会分享我使用的特定值,因为我认为没有人会发现这些信息有用。
请注意,一旦使用了更具代表性的范围,原始代码共享就可以了。