我正在尝试通过阅读在线提供的资料来了解GMM.我已经使用K-Means实现了聚类,并且看到GMM将如何与K-means进行比较.
这是我所理解的,如果我的概念错了,请告诉我:
GMM就像KNN一样,在这两种情况下都实现了聚类.但在GMM中,每个群集都有自己独立的均值和协方差.此外,k-means执行数据点到集群的硬分配,而在GMM中,我们得到一组独立的高斯分布,并且对于每个数据点,我们有一个它属于其中一个分布的概率.
为了更好地理解它,我使用MatLab对其进行编码并实现所需的聚类.我使用SIFT功能进行特征提取.并使用k-means聚类来初始化值.(这来自VLFeat文档)
%images is a 459 x 1 cell array where each cell contains the training image
[locations, all_feats] = vl_dsift(single(images{1}), 'fast', 'step', 50); %all_feats will be 128 x no. of keypoints detected
for i=2:(size(images,1))
[locations, feats] = vl_dsift(single(images{i}), 'fast', 'step', 50);
all_feats = cat(2, all_feats, feats); %cat column wise all features
end
numClusters = 50; %Just a random selection.
% Run KMeans to pre-cluster the data
[initMeans, assignments] = vl_kmeans(single(all_feats), numClusters, ...
'Algorithm','Lloyd', ...
'MaxNumIterations',5); …Run Code Online (Sandbox Code Playgroud) matlab classification cluster-analysis machine-learning mixture-model
我知道在OpenCV 2.1中我们有一个设置ROI的函数:cvSetImageROI(),但这样的函数在2.4中不存在(或者至少我无法在其手册和帮助部分找到它.)
但是,这是我能找到的唯一有用的代码,它使用opencv 2.4进行法师的投资回报率,但我无法理解它:
// define image ROI
cv::Mat imageROI;
imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));
// add logo to image
cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);
Run Code Online (Sandbox Code Playgroud)
在这里,他们希望在原始图像右下方的大图像中添加一个非常小的日志.
所以我从这里了解到,创建另一个矩阵来保持ROI.使用rect函数给出的尺寸和尺寸等于他们想要添加的小徽标的尺寸.
然后thsi让我困惑:cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);这里addWeighted的源1是ROI维度集,源2是徽标,目标也是ROI维度集.它是否正确?还是我错过了什么?
在此之后,显示结果并将徽标添加到大图像中.在这些命令中包含了大图像.
在此之前我也想尝试自己的代码,以帮助澄清情况.但我收到此错误,因为无法识别image():'image': identifier not found
int _tmain(int argc, _TCHAR* argv[])
{
Mat src1, imageROI, logo;
logo = imread("c:\\car1.jpg", -1);
imageROI= image(Rect(385,270,logo.cols,logo.rows));
addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);
namedWindow("meh", CV_WINDOW_AUTOSIZE);
imshow("meh", imageROI);
waitKey(0);
return 0;
Run Code Online (Sandbox Code Playgroud)
}
我在教自己verilog.我在介绍章节中说过要执行除法的书,我们使用'/'运算符或'%'运算符.在后面的章节中,它说分割对于verilog而言太复杂而且无法合成,因此为了执行除法,它引入了一个长算法.
所以我很困惑,不能verilog处理简单划分?/运营商没用吗?
我有.NET程序集文件,我需要它在MATLAB中工作.(该库是用C#创建的,我有相应的源代码)
在文档之后,我发现以下命令将在MATLAB中加载程序集并使其类可用于"在MATLAB中".但它似乎没有起作用.我用它来加载文件:
color = NET.addAssembly('c:\path\to\file\EvolutionMapsClassLib.dll');
Run Code Online (Sandbox Code Playgroud)
加载很好,我在工作区中看到一个1x1 .NET程序集对象.当我输入时,color我得到以下结果:
color =
NET.Assembly handle
Package: NET
Properties for class NET.Assembly:
AssemblyHandle
Classes
Structures
Enums
GenericTypes
Interfaces
Delegates
Run Code Online (Sandbox Code Playgroud)
所以显然它已经正确加载,而且打字color.Classes提供以下内容:
>> color.Classes
ans =
'EvolutionMaps.EvolutionMap'
'EvolutionMaps.EvolutionMap+EstimationResults'
'EvolutionMaps.PrincipalDirectionEvolutionMap'
'EvolutionMaps.CharacterDimensionsEstemator'
'EvolutionMaps.MapBlob'
'EvolutionMaps.MapsMetric'
'EvolutionMaps.MapsMetric+MapMinimalComparable'
'EvolutionMaps.MapsL2Distance'
'EvolutionMaps.DiagonalEvolutionMap'
'EvolutionMaps.EvolutionMapGenerator'
'EvolutionMaps.HeightEvolutionMap'
'EvolutionMaps.FullnessEvolutionMap'
'EvolutionMaps.YvalEvolutionMap'
'EvolutionMaps.ImageExtractor'
'EvolutionMaps.HorisontalProjectionDistance'
'EvolutionMaps.StrokeWidthEvolutionMap'
'EvolutionMaps.ConnectedComponentsFinder'
'EvolutionMaps.ColorMap'
'EvolutionMaps.ColorMap+GrayColorMap'
'EvolutionMaps.ColorMap+JetColorMap'
'EvolutionMaps.TransitionAvgEvolutionMap'
'EvolutionMaps.PrincipalProjectionEvolutionMap'
'EvolutionMaps.ConnectedComponent'
'EvolutionMaps.WidthEvolutionMap'
Run Code Online (Sandbox Code Playgroud)
这似乎运作良好,但根据在线帮助,为了与这些类进行交互,我需要知道方法和属性.
这是我遇到问题的地方,既不是properties也不行methods.我尝试了每个变体来获取属性或方法列表但我不断收到此错误:
>> properties color.EvolutionMaps.ColorMap
No properties for class color.EvolutionMaps.ColorMap or no class color.EvolutionMaps.ColorMap.
>> properties color.Classes.EvolutionMaps.ColorMap …Run Code Online (Sandbox Code Playgroud) 我关注的编码是fisher编码,因为我已经证明我的工作效果最好.所以我想在我提取的(SIFT)功能上测试Fisher编码,并测试系统的性能,无论是否编码.
而不是重新开始我发现vl_feat有一个用于fisher编码的内置库,他们有一个教程,并在这里链接
现在我已经完成了所需的大部分工作,但实际上编码的内容让我感到困惑,例如教程清楚地表明使用GMM获得的参数执行Fisher编码,例如[means, covariances, priors]SIFT提取的特征将在这里使用在GMM中根据教程:
Fisher编码使用GMM来构建可视单词字典.为了举例说明构建GMM,考虑许多二维数据点.实际上,这些点将是SIFT或其他本地图像特征的集合.
numFeatures = 5000 ;
dimension = 2 ;
data = rand(dimension,numFeatures) ;
numClusters = 30 ;
[means, covariances, priors] = vl_gmm(data, numClusters);
Run Code Online (Sandbox Code Playgroud)
一旦我执行了这一步,我将编码另一个数据集?这让我很困惑.我已经使用我提取的SIFT功能生成GMM的参数.
接下来,我们创建另一组随机向量,这些向量应使用Fisher Vector表示和刚刚获得的GMM进行编码:
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);
Run Code Online (Sandbox Code Playgroud)
所以这encoded是最终的结果,但它编码了什么?我想要从我的图像中提取的SIFT功能进行编码,但是如果我按照GMM中使用的教程进行编码.如果是这样的话,那是datatoBeEncoded什么?我是否再次使用SIFT专长?
谢谢
更新:
@Shai
谢谢,但我相信我一定做错了.我不太明白你的意思是"将图像与自己比较".我有4个班,每班1000个图像.所以我使用了第1类中的前600个图像来学习gmm参数,然后使用这些参数来编码fisher矢量
numClusters = 128 ;
[means, covariances, priors] = vl_gmm(data, numClusters);
Run Code Online (Sandbox Code Playgroud)
所以每个means, covariances都有大小128 x 128和尺寸的前辈1 x 128
现在,当我使用这些函数来对400幅图像上的fisher矢量进行编码时
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);
Run Code Online (Sandbox Code Playgroud)
编码的大小是非常不同的,大小的东西 …
matlab encoding classification image-processing feature-detection
我有一个庞大的数据集(32000*2500),我需要进行培训.这对于我的分类器来说似乎太过分了,所以我决定对维数降低进行一些阅读,特别是对PCA进行阅读.
根据我的理解,PCA选择当前数据并在另一个(x,y)域/规模上重新创建它们.这些新坐标并不意味着什么,但数据被重新排列以给出一个轴最大变化.在这些新系数之后,我可以放弃cooeff具有最小变化.
现在我试图在MatLab中实现它,并且在提供的输出方面遇到了麻烦.MatLab始终将行视为观察,将列视为变量.所以我的pca函数是我的大小矩阵(32000*2500).这将在大小的输出矩阵中返回PCA系数2500*2500.
pca的帮助说明:
每列coeff包含一个主成分的系数,列按成分方差的降序排列.
在此输出中,哪个维度是我的数据的观察?我的意思是,如果我必须将它提供给分类器,那些行coeff代表我的数据观察还是现在是列的coeff?
如何删除变化最小的系数?
matlab classification machine-learning pca dimensionality-reduction
我试图将扫描的文本文档模糊到文本行被模糊为黑色的程度.我的意思是文本相互融合,我看到的只是黑色线条.
我是MATLAB的新手,虽然我知道基础知识,但我无法使图像模糊不清.我读过这个:Gaussian Blurr,根据sigma函数管理/决定模糊.但这并不是我写的代码中的工作原理.
在尝试学习Matlab中的高斯模糊时,我发现它是通过使用这个函数实现的: fspecial('gaussian',hsize,sigma);
所以显然有两个变量hsize指定函数中的行数或列数,而sigma标准偏差.
有人可以解释一下hsize这里的重要性以及为什么它对结果的影响要大得多sigma?
为什么即使我增加到sigma一个非常高的值,模糊器也不会受到影响,但是通过增加图像会使图像失真很多hsize
这是我的代码:
img = imread('c:\new.jpg');
h = fspecial('gaussian',hsize,sigma);
out = imfilter(img,h);
imshow(out);
Run Code Online (Sandbox Code Playgroud)
并附上结果:
为什么它不仅受到控制sigma?扮hsize演什么角色?为什么我不能让它模糊文本而不是扭曲整个图像?
谢谢

我初始化了一个很长的单元格数组(向量?)
train_labels = cell(16218, 1);
Run Code Online (Sandbox Code Playgroud)
这些将使用来自50个不同文件夹的文件填充,以确保文件在正确的位置编入索引,我需要写入的最后一个单元格数组的索引.
例如,在读取一个文件夹后,train_labels已达到索引5406.现在要从下一个文件夹中读取图像,必须将它们保存到下一个索引中5407.为了完成这项工作,我需要找到最后一个非空数组的位置train_labels.
由于简单find(train_labels,1,'last')不适用于单元阵列.我用过,cellfun但也没用.这是我试过的:
cellfun(@find, train_labels, 'last')
Error using cellfun
Input #3 expected to be a cell array, was char instead.
Run Code Online (Sandbox Code Playgroud)
非常感谢有关如何获取单元格数组的最后一个索引的任何指导.
谢谢
我必须应用于dct2我的图像的小窗口,最好使用重叠窗口.
我发现,有在Matlab两种功能,可以使这一切成为可能blockproc和im2col.我也很难理解,并希望得到一些澄清.
blockproc可以用于使用BorderSize和TrimBorder参数在滑动窗口上实现我的函数.
B = blockproc(A,[64,64],fun,'BorderSize',[5,5], 'TrimBorder', 'false');
Run Code Online (Sandbox Code Playgroud)
我意识到这会创建一个块[64 + 2*5, 64 + 2*5]并@fun在每个块上应用该函数.但由于我无法@fun在调试中进入我的功能以验证正确的操作,我不能确定这是我需要的.我的上述代码是否符合我的要求?我知道我得到了一个连续的结果,B但它应该在一个重叠的滑块上.这会实现我的需求吗?
第二是im2col.im2col(A,[m n],block_type)将块分成m个n块并将它们排列成列,所以每列是一个块?如果是这样,重叠如何控制?如果每个块都是一列,我可以dct2在每列上成功应用该功能吗?因为我怀疑它会将向量作为输入吗?
一些澄清将不胜感激.
我已经以 RGB 和 HSV 格式生成了我的图像的散点图,并且我正在使用inRange()通过观察该图来设置单一颜色的阈值。
为了获得准确的 RGB 和 HSV 值,我使用paint.net 的颜色选择器来获取 RGB 值,然后使用RGB 到 HSV 转换器来获取 HSV 值。
像素颜色和散点图由以下生成:
img = cv2.imread('C:\\b_.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pixel_colors = img.reshape((np.shape(img)[0]*np.shape(img)[1], 3))
norm = colors.Normalize(vmin=-1., vmax=1.)
norm.autoscale(pixel_colors)
pixel_colors = norm(pixel_colors).tolist()
h, s, v = cv2.split(img_hsv)
fig = plt.figure()
axis = fig.add_subplot(1, 1, 1, projection="3d")
axis.scatter(h.flatten(), s.flatten(), v.flatten(), facecolors=pixel_colors, marker=".")
axis.set_xlabel("Hue")
axis.set_ylabel("Saturation")
axis.set_zlabel("Value")
plt.show()
Run Code Online (Sandbox Code Playgroud)
我需要从我的图像中提取黄色。如前所述,我使用paint.net 颜色选择器来获取浅黄色和深黄色的RGB 值。然后使用转换器获取inRange()函数的 HSV 值。
light_yellow = (60, 89, 97) # HSV VALUES …Run Code Online (Sandbox Code Playgroud)