如何使用python

时间:2018-09-25 18:11:15

标签: python-3.x opencv image-processing

我正在尝试从图像中检测出一些斑点,并在裁切后将其保存在多个图像中。

图片:

enter image description here

我只想播种wbc。

脚本:我正在尝试,但不明白。

import cv2
import numpy as np;

# Read image
im = cv2.imread("C:/Users/Desktop/MedPrime_Tech_Work/tag-145218-Default-10X.jpg", cv2.IMREAD_GRAYSCALE)

# Set up the detector with default parameters.
detector = cv2.SimpleBlobDetector_create()

# Detect blobs.
keypoints = detector.detect(im)

print (keypoints)

# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show keypoints
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

我的代码正在运行,但问题是如何检测斑点?如图所示。

先谢谢了。请提出一些建议

编辑1

获取错误

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-11-2754358a7c43> in <module>()
----> 1 import PyDIP as dip
      2 import PyDIP.PyDIPviewer as dv

ModuleNotFoundError: No module named 'PyDIP'

我正在尝试安装PyDIP,但不是没有问题。

3 个答案:

答案 0 :(得分:1)

我这里没有OpenCV,但是使用PyDIP(我是作者)。

在这种情况下,由于细胞的颜色和大小不同,因此检测非常简单。 Spaceman suggested to use the HSV color space。这是个好主意,但是由于这很简单,因此我将仅使用单独的绿色和蓝色通道。 “ wbc”单元在绿色通道中非常暗,而在蓝色通道中则不是。在两个通道中,所有黑色(在视场和图形之外)都为黑色。因此,检测“ wbc”和“血小板”细胞是在绿色通道中找到蓝色区域中不暗的区域的问题。接下来,简单的尺寸标准将排除“血小板”细胞。

最后,要进行裁剪,我将附近的检测分组(因为它们似乎属于一起),并从图像中裁剪出这些分组:

import PyDIP as dip

img = dip.ImageReadTIFF('/home/cris/tmp/cells')

# detect wbc
mask = dip.Erosion(img.TensorElement(2), dip.SE(7, 'elliptic'))
wbc = (img.TensorElement(1) < 50) & (mask > 50) # threshold green and blue channels, exact threshold values don't matter, color differences are obvious
wbc = dip.Closing(wbc, dip.SE(15, 'elliptic')) # fills small holes
wbc = dip.Opening(wbc, dip.SE(25, 'elliptic')) # removes small cells

# group and find bounding boxes
labs = dip.Label(dip.BinaryDilation(wbc, 2, 50)) # 50 is the half the distance between detections that belong together
labs *= wbc
m = dip.MeasurementTool.Measure(labs, features=['Minimum','Maximum'])

# crop
margin = 10 # space to add around detections when cropping
for obj in m.Objects():
    left = int(m[obj]['Minimum'][0]) - margin
    right = int(m[obj]['Maximum'][0]) + margin
    top = int(m[obj]['Minimum'][1]) - margin
    bottom = int(m[obj]['Maximum'][1]) + margin
    crop = img[left:right, top:bottom]
    dip.ImageWriteTIFF(crop, '/home/cris/tmp/cells%d'%obj)

这会导致以下小图像:

cells1 cells2 cells3

答案 1 :(得分:0)

当您说代码正在运行时,我认为这意味着您已经在检测要检测的内容,而有关裁剪的问题就是您要获取检测到的斑点的图像。

如果我做对的话,请记住OpenCV映像只是numpy数组,因此您所需要的只是该数组的一个子集。这是您想要的吗?

blob_images = list()
for kp in keypoints:
    x, y, r = *kp.pt, kp.size
    crop = im[y-r:y+r, x-r:x+r]
    blob_images.append(crop)

现在,您应该具有裁剪图像的列表。从那里,您可以对其进行过滤,以便仅获取白细胞或用cv2.imwrite()保存它们,或者做您想做的任何事情。

请注意,crop只是im数组的视图,而不是单独的副本。这样可以节省内存,但是修改一个将修改另一个。如果需要解耦,请使用im[y-r:y+r, x-r:x+r].copy()

答案 2 :(得分:0)

我尝试使用您能看到的图像来检测紫色的WBC。

import cv2
import numpy as np;

# Read image
im = cv2.imread("image.jpg")
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)

我尝试将其转换为颜色空间,因为我认为wbc总是会变成紫色。由于我们必须按颜色检测对象,因此最好将其迷住到其他HSV颜色空间中,您可以在link下阅读以了解下面的HSV是什么。     cv2.imwrite(“ result1.jpg”,hsv) enter image description here

gray_image = cv2.cvtColor(hsv, cv2.COLOR_BGR2GRAY)
cv2.imwrite("result2.jpg",gray_image)

enter image description here

res,thresh_img=cv2.threshold(gray_image,210,255,cv2.THRESH_BINARY_INV) 

此处210是用于获取白色(即WBC)的斑点的灰度阈值。

im2, contours, hierarchy = cv2.findContours(thresh_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cv2.imwrite("result3.jpg",thresh_img)

enter image description here 此图像将所有WBC都为黑色。通过使用findContours,我们得到了黑色的轮廓。

count=0
original_image_copy=im.copy()    
for c in contours:
    area=cv2.contourArea(c)
    if area>10 and area<2500:
        (x,y),radius = cv2.minEnclosingCircle(c)
        center = (int(x),int(y))
        radius = int(radius)
        img = cv2.circle(im,center,radius,(0,255,0),10)
        cv2.circle(im,center,radius,(0,255,0),10)
        x, y, w, h = cv2.boundingRect(c)
        if w>20 and h>20:
            roi = original_image_copy[y:y+h, x:x+w]
            cv2.imwrite("images/roi"+str(count)+".jpg", roi) # make sure you have folder `images` in same folder in which you are running code.
        # cv2.drawContours(im, [c], 0,(0,255,0), 10)
cv2.imwrite("result4.jpg",im)

enter image description here 我知道这不是一个完美的答案,但是您可以尝试通过以其他方式单击图像来消除圆角中的一些噪点,或者可以使用图像处理功能(例如形态学操作,例如膨胀)。