我用matlab读取了一个图像
input = imread ('sample.jpeg');
Run Code Online (Sandbox Code Playgroud)
然后我做
imhist(input);
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误:
??? Error using ==> iptcheckinput
Function IMHIST expected its first input, I or X, to be two-dimensional.
Error in ==> imhist>parse_inputs at 275
iptcheckinput(a, {'double','uint8','logical','uint16','int16','single'}, ...
Error in ==> imhist at 57
[a, n, isScaled, top, map] = parse_inputs(varargin{:});
Run Code Online (Sandbox Code Playgroud)
运行后size(input),我看到我的输入图像很大300x200x3.我知道第三个维度是用于颜色通道,但有没有办法显示这个直方图?谢谢.
如何检测以下图像中的黑点?(我只粘贴一个测试图像,使问题看起来很紧凑.可以找到更多图像→这里←).

如上所示,背景颜色大致为蓝色,点颜色为"黑色".如果选择一个黑色像素并测量其RGB颜色,则该值可以是
(0,44,65)或
(14,69,89)....因此,我们不能设置一个范围来告诉像素是黑点或背景的一部分.
我测试了10张不同颜色的图像,但我希望我能找到一种方法来检测可能由三种或更多颜色组成的更复杂背景中的黑点,只要人眼可以轻松识别黑点.可以省略一些极小或模糊的点.
上个月,我在stackoverflow上问了一个类似的问题,但是没有一个完美的解决方案,但是有一些很好的答案.如果您有兴趣,请详细了解我的工作.
以下是我尝试过的方法:
转换为灰度或图像的亮度.困难在于我无法找到进行二值化的自适应阈值.显然,将彩色图像转换为灰度或使用亮度(HSV)将失去许多有用的信息.计算自适应阈值的Otsu算法也不起作用.
计算RGB直方图.在我的上一个问题中,natan的方法是通过直方图估计黑色.节省时间,但自适应阈值也是一个问题.
聚类.我尝试过k-means聚类,发现它对于只有一种颜色的背景非常有效.缺点(参见我自己的答案)是我需要提前设置聚类中心的数量,但我不知道背景如何.更重要的是,它太慢了!我的应用程序是在iPhone上实时捕获,现在它可以使用k-means每秒处理7~8帧(我认为20 FPS是好的).
我认为不仅相似的颜色而且相邻的像素应该"聚集"或"合并"以便提取黑点.请指导我解决问题的正确方法.任何建议或算法将不胜感激.没有免费的午餐,但我希望在成本和准确性之间做出更好的平衡.
我在二进制图像中有一个网格(可以旋转).如何使用MATLAB了解该网格的近似公式?
示例图片:
http://www.pami.sjtu.edu.cn/people/wyg/images/print5.jpg
有时这些黑点缺失,所以我需要公式或"方法"来估计这些黑点的可能中心.
我试过通过使用regionprops,它帮助我获得这些存在的黑点的中心,但不知道黑点是否缺失
clear all
im = imread('print5.jpg');
im = im2bw(im);
[sy,sx] = size(im);
im = imcomplement(im);
im(150:200,100:150) = 0; % let some dots missing!
im = imclearborder(im);
st = regionprops(im, 'Centroid');
imshow(im) hold on;
for j = 1:numel(st)
px = round(st(j).Centroid(1,1));
py = round(st(j).Centroid(1,2));
plot(px,py,'b+')
end
Run Code Online (Sandbox Code Playgroud) 这个问题特定于opencv:opencv文档中给出的kmeans示例有一个双通道矩阵 - 特征向量的每个维度都有一个通道.但是,其他一些例子似乎表明它应该是一个单通道矩阵,沿着列有特征,每个样本有一行.哪个是对的?
如果我有一个5维特征向量,我应该使用的输入矩阵:这一个:
cv::Mat inputSamples(numSamples, 1, CV32FC(numFeatures))
Run Code Online (Sandbox Code Playgroud)
或者这个:
cv::Mat inputSamples(numSamples, numFeatures, CV_32F)
Run Code Online (Sandbox Code Playgroud)