我尝试了以下代码。
img=imread("test1.jpg");gimg=rgb2gray(img);imshow(gimg);bw = gimg < 255;L = bwlabel(bw);imshow(label2rgb(L, @jet, [.7 .7 .7]))s = regionprops(L, 'PixelIdxList', 'PixelList');s(1).PixelList(1:4, :)idx = s(1).PixelIdxList;sum_region1 = sum(gimg(idx));x = s(1).PixelList(:, 1); y = s(1).PixelList(:, 2);xbar = sum(x .* double(gimg(idx))) / sum_region1ybar = sum(y .* double(gimg(idx))) / sum_region1hold onfor k = 1:numel(s) idx = s(k).PixelIdxList; pixel_values = double(gimg(idx)); sum_pixel_values = sum(pixel_values); x = s(k).PixelList(:, 1); y = s(k).PixelList(:, 2); xbar = sum(x .* pixel_values) / sum_pixel_values; ybar = sum(y .* pixel_values) / sum_pixel_values; plot(xbar, ybar, '*')endhold offa=round(xbar)-90;b=round(xbar)+90;c=round(ybar)-90;d=round(ybar)+90;roi=gimg(a:b,c:d);imshow(roi);roi(:,:,2)=0;roi(:,:,3)=0;se = strel('cube',20);closeBW = imclose(roi,se);figure imshow(closeBW);de=rgb2gray(closeBW);ed=edge(de,"canny");imshow(ed);j=kmeans(ed,3);
我所做的是获取一张图像并提取其灰度图。我专注于图像中强度非常高的部分。然后我取了图像的红色分量,并对结果图像应用了闭合操作。之后,我使用Canny方法进行了边缘检测。然后我尝试对边缘检测的结果使用kmeans聚类。
我得到一个错误提示说kmeans需要一个实数矩阵。希望能得到帮助。
回答:
在MATLAB / Octave中,edge
返回一个二进制 / logical
矩阵。kmeans
要求输入是一个double
或single
矩阵。
因此,只需将ed
转换为double
类型即可继续:
ed=edge(de,"canny");imshow(ed);ed = double(ed); %// 更改j=kmeans(ed,3);