我正在尝试使用OpenCV来限制视频流中的红色像素.我有其他颜色很好地工作,但红色带来问题,因为它包裹在色调轴周围(即HSV(0,255,255)和HSV(179,255,255)都是红色).我现在使用的技术不太理想.基本上:
cvInRangeS(src, cvScalar(0, 135, 135), cvScalar(20, 255, 255), dstA);
cvInRangeS(src, cvScalar(159, 135, 135), cvScalar(179, 255, 255), dstB);
cvOr(dstA, dstB, dst);
Run Code Online (Sandbox Code Playgroud)
这是次优的,因为它需要代码中的分支用于红色(潜在的错误),两个额外图像的分配,以及与蓝色的简单情况相比的两个额外操作:
cvInRangeS(src, cvScalar(100, 135, 135), cvScalar(140, 255, 255), dst);
Run Code Online (Sandbox Code Playgroud)
我遇到的更好的选择是"旋转"图像的颜色,使目标色调为90度.例如.
int rotation = 90 - 179; // 179 = red
cvAddS(src, cvScalar(rotation, 0, 0), dst1);
cvInRangeS(dst1, cvScalar(70, 135, 135), cvScalar(110, 255, 255), dst);
Run Code Online (Sandbox Code Playgroud)
这允许我类似地对待所有颜色.
但是,cvAddS
当它们低于0时,操作不会将色调值包装回180,因此会丢失数据.我看着转换图像,CvMat
以便我可以减去它,然后使用模数将负值包回到范围的顶部,但CvMat
似乎不支持模数.当然,我可以迭代每个像素,但我担心这会非常慢.
我已经阅读了很多教程和代码示例,但它们似乎只是方便地查看不包含色调频谱的范围,或者使用甚至更加丑陋的解决方案(例如,cvInRangeS
通过遍历每个像素重新实现并执行手动比较颜色表).
那么,通常的解决方法是什么?什么是最好的方式?每个人的权衡是什么?迭代像素比使用内置CV函数慢得多吗?
我正在分析大约2M原始单词的语料库.我使用gensim的word2vec构建模型,使用sklearn TSNE嵌入向量,并使用sklearn DBSCAN对向量(来自word2vec,而不是TSNE)进行聚类.TSNE输出看起来很正确:2D空间中单词的布局似乎反映了它们的语义.有一组拼写错误,衣服等等.
但是,我无法让DBSCAN输出有意义的结果.它似乎标记了"0"组中的所有内容(图像中的彩色蓝绿色).当我增加epsilon时,"0"组接管所有内容.以下是epsilon = 10和epsilon = 12.5的屏幕截图.使用epsilon = 20,几乎所有内容都在同一组中.
例如,我希望所有的"衣服"字组聚集在一起(它们是非聚集的@ eps = 10).我还期望更多关于100个簇的顺序,而不是5-12个簇,并且能够使用epsilon控制簇的大小和数量.
那么几个问题.我是否正确理解DBSCAN的使用?还有其他聚类算法可能是更好的选择吗?我怎么知道我的数据有什么好的聚类算法?
考虑到TSNE看起来是正确的,假设我的模型调得很好是否安全?
我可以使用哪些其他技术来将问题与群集隔离开来?我怎么知道这是我的word2vec模型,我对DBSCAN的使用,还是其他什么?
这是我用来执行DBSCAN的代码:
import sys
import gensim
import json
from optparse import OptionParser
import numpy as np
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
# snip option parsing
model = gensim.models.Word2Vec.load(options.file);
words = sorted(model.vocab.keys())
vectors = StandardScaler().fit_transform([model[w] for w in words])
db = DBSCAN(eps=options.epsilon).fit(vectors)
labels = db.labels_
core_indices = db.core_sample_indices_
n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
print("Estimated {:d} clusters".format(n_clusters), …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在金属着色器中实现简单的LUT颜色等级。它与彩色LUT一起使用,但是当LUT为灰度时,问题就会出现。首先,加载灰度图像会导致“图像解码失败”错误,该错误已通过以下方式修复:此错误解决方法该错误。
通过将图像重新表征为资产束中的纹理,可以成功加载图像,但是输出图像上会出现条纹。果然,捕获GPU帧表明已在纹理中引入了条纹:
在资产捆绑包或源PNG中进行“快速查看”时,不会出现此带。检查纹理的像素格式表明它已被编码为ASTC_4x4_sRGB, Apple文档指出这是低动态范围内容的压缩格式。似乎这种压缩可能会导致LUT纹理降级。通常,在使用LUT时,我会避免任何压缩,但是我找不到在MTKTextureLoader中禁用压缩或强制采用像素格式的方法。
我还尝试了各种MTKTextureLoader选项,包括启用/禁用sRGB,mipmap等。
关于如何解决条带的任何想法?