- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用分割颜色的阈值。但这不是行不通的。如何在这张图片中分割红色和绿色。
感谢
这张使用Kmeans后的图片
使用阈值分割后的图像
我的代码
import numpy as np
import cv2
img = cv2.imread('watermelon.jpg')
Z = img.reshape((-1,3))
# convert to np.float32
Z = np.float32(Z)
# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 4
ret,label,center=cv2.kmeans(Z,K, criteria,10,cv2.KMEANS_RANDOM_CENTERS)
# Now convert back into uint8, and make original image
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))
gray = cv2.cvtColor(res2,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#segmentation
gray = cv2.cvtColor(res2,cv2.COLOR_BGR2GRAY)
ret, threshseg = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
cv2.imwrite('img_CV2_95.jpg',threshseg)
cv2.imwrite('img_CV2_94.jpg',res2)
cv2.imshow('threshseg',threshseg)
cv2.imshow('thresh',thresh)
cv2.imshow('res2',res2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
最佳答案
我会利用标签数组并将其用于分割。
首先将其重新整形为与输入图像相同的宽度/高度。
labels = labels.reshape((img.shape[:-1]))
现在,假设您要获取标签为 2
的所有像素。
mask = cv2.inRange(labels, 2, 2)
只需将它与 cv2.bitwise_and
一起使用即可屏蔽图像的其余部分。
mask = np.dstack([mask]*3) # Make it 3 channel
ex_img = cv2.bitwise_and(img, mask)
这种方法的好处是您不需要对任何颜色范围进行硬编码,因此相同的算法适用于许多不同的图像。
示例代码:
注意:为 OpenCV 3.x 编写。 OpenCV 2.4.x 的用户需要适本地更改 cv2.kmeans
的调用(请参阅文档了解差异)。
import numpy as np
import cv2
img = cv2.imread('watermelon.jpg')
Z = np.float32(img.reshape((-1,3)))
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 4
_,labels,centers = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
labels = labels.reshape((img.shape[:-1]))
reduced = np.uint8(centers)[labels]
result = [np.hstack([img, reduced])]
for i, c in enumerate(centers):
mask = cv2.inRange(labels, i, i)
mask = np.dstack([mask]*3) # Make it 3 channel
ex_img = cv2.bitwise_and(img, mask)
ex_reduced = cv2.bitwise_and(reduced, mask)
result.append(np.hstack([ex_img, ex_reduced]))
cv2.imwrite('watermelon_out.jpg', np.vstack(result))
示例输出:
不同颜色的示例输出:
关于python-2.7 - 使用 Kmeans 的 OpenCV 颜色分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52802910/
你好,stackoverflow 社区, 我在运行 kmeans (统计数据包)和 Kmeans (amap 包)在 Iris 数据集上。在这两种情况下,我使用相同的算法(Lloyd–Forgy)、相
我想将KMeans应用于具有Alpha蒙版的图像。它应该只对可见的颜色起作用。我希望能写成一行。起始图:。。天真地使用KMeans(哎呀,都是一种颜色):。。做实验。浏览所有Alpha选项。-Alph
我想将KMeans应用于具有Alpha蒙版的图像。它应该只对可见的颜色起作用。我希望能写成一行。起始图:。。天真地使用KMeans(哎呀,都是一种颜色):。。做实验。浏览所有Alpha选项。-Alph
在对一些具有 3 个簇的向量进行 K 均值拟合时,我能够获取输入数据的标签。KMeans.cluster_centers_ 返回中心的坐标,所以不应该有一些与之对应的向量吗?如何找到这些簇的质心处的值
我正在使用视频中的 kmeans 聚类技术,但我不明白为什么我们在 kmeans 聚类中使用 .fit 方法? kmeans = KMeans(n_clusters=5, random_state=0
MATLAB K-means 给出图像的准确结果,而使用 OpenCV c++ 的 k-means 不给出相同的结果,即使参数相同。实现上有什么不同吗? 最佳答案 Matlab 的 kmeans fu
我正在使用 scikit learn 的 Kmeans 算法对评论进行聚类。 sentence_list=['hello how are you', "I am doing great", "my n
来自 sklearn KMeans 的文档 class sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_it
我尝试使用 scikit-learn 实现并行运行 KMeans,但我不断收到以下错误消息: Traceback (most recent call last): File "run_kmeans
前言 K-means是一种经典的无监督学习算法,用于对数据进行聚类。K-means算法将数据集视为具有n个特征的n维空间,并尝试通过最小化簇内平方误差的总和来将数据点划分为簇。本文将介绍K-m
所以按照文档中的示例 (here): The KElbowVisualizer implements the “elbow” method to help data scientists select
我试图将数据点(通过欧几里得距离)分配给一组已知的、预定义的中心点,将点分配给最近的固定中心点。 我有一种感觉,我可能过于复杂/遗漏了一些基本的东西,但我已经尝试使用具有预定中心且没有迭代的 kmea
我想知道其他人在用 K-means 集群排序做什么。我正在制作热图(主要是 ChIP-Seq 数据)并使用自定义热图函数(基于 R 的内置热图函数)获得漂亮的数字。但是,我想要两个改进。第一个是根据递
我正在尝试用 Java 实现 KMeans,但遇到了一个导致所有结果都丢失的情况。当给定一些随机选择的初始化质心,数据进入其中一个质心实际上并未定义簇的状态时,就会发生这种情况。例如,如果 K=3,则
示例: load kmeansdata %provides X variable Y=bsxfun(@minus,X,mean(X,2))'/sqrt(size(X,2)-1); %normalize
我正在大数据集上运行 k-means。我是这样设置的: from sklearn.cluster import KMeans km = KMeans(n_clusters=500, max_iter
我有一组包含 50 个特征(c1、c2、c3 ...)的数据,超过 80k 行。 每行包含标准化数值(范围 0-1)。它实际上是一个标准化的虚拟变量,其中一些行只有很少的特征,3-4(即如果没有值则分
我想对我的数据集的特定列执行 K 均值。由于这些是分类数据,我计划对其进行 onehot_encoding。现在我想知道是否可以对特定列进行 K-means 并显示所有列的结果(例如一组)? 例如,我
使用 K 均值聚类生成 K 个簇,我们如何计算每个簇的面积?有公式吗? 我已经尝试过 gArea() 与 rgeos 包,但我收到错误代码“ unable to find an inherited m
我知道下定义的 KMeans 算法需要特征缩放sklearn.cluster.KMeans 我的问题是,在使用 KMeans 之前是否需要手动完成,或者 KMeans 是否会自动执行特征缩放?如果是自
我是一名优秀的程序员,十分优秀!