首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何过滤黑白图像中超出指定区域的白位?

如何过滤黑白图像中超出指定区域的白位?
EN

Stack Overflow用户
提问于 2019-12-02 03:28:31
回答 1查看 44关注 0票数 2

我有一张奇特的图片,“显示小鼠大脑皮层神经元回路图的脑弓图像”。

我想要计算绿色闪烁的数量,所以用15个簇对其运行k均值,然后我分离出两种颜色,这两种颜色一起完成了工作,但我留下了许多绿色条纹/尾巴和黄色闪烁的边缘。

我希望找到一些按区域划分阈值的算法,并只选择实际的绿色闪烁,或者选择另一种我不会遇到这个问题的方法。我使用了来自sklearn.cluster的python k-means

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-03 09:46:36

您可以使用颜色阈值来分离绿色闪烁。其思想是将图像转换为HSV格式,并定义一个下限/上限颜色阈值范围。这将为您提供一个二进制掩码。在这里,我们可以通过使用椭圆形状的核进行形态学打开来进行额外的处理,以去除噪声和尾部。最后,我们可以找到轮廓,并使用定义了阈值区域的轮廓区域进行过滤,以仅保留较大的斑点。结果如下:

代码语言:javascript
运行
复制
Count: 116

代码

代码语言:javascript
运行
复制
import numpy as np
import cv2

# Color threshold
image = cv2.imread('1.jpg')
original = image.copy()
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([42, 67, 0])
upper = np.array([69, 255, 255])
mask = cv2.inRange(hsv, lower, upper)

# Perform morphological operations
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=1)

# Find contours and filter using contour area
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
count = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area < 5: 
        cv2.drawContours(opening,[c], -1, (0,0,0), -1)
    else:
        count += 1

result = cv2.bitwise_and(original,original,mask=opening)
print('Count: {}'.format(count))

cv2.imshow('mask', mask)
cv2.imshow('opening', opening)
cv2.imshow('result', result)
cv2.waitKey()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59129148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档