我做了:
I = imread('abc.jpg');
BW = roipoly(I);
我正在尝试获取我在创建多边形时单击的所有点的像素值。
r= BW(:, :, 1 );
g= BW(:, :, 2 );
b= BW(:, :, 3 );
这不起作用。
最后我想写信给文本文件:
filename = fullfile('C:\Users\ABC\Documents\MATLAB','test.txt');
fid = fopen(filename,'w');
fprintf(fid, '%d %d %d', r,g,b);
fclose(fid);
答案 0 :(得分:0)
您的问题是size(BW)
仅为2D而I
为3D。 BW
只是一个二进制掩码,表示roipoly
选择了哪些像素。
一种可能的解决方案是使用BW
掩码从I
中选择像素:
rI = reshape(I,[],3); %// "flatten" the image
selectedRGB = rI(BW,:); %// select the pixels in the polygon
现在您可以写入文件
dlmwrite( fullfile('C:\Users\ABC\Documents\MATLAB','test.txt'), selectedRGB, 'delimiter', ' ');
有关详细信息,请参阅dlmwrite
。
如果您只对多边形角的RGB值(而不是整个区域)感兴趣,可以使用以下代码
[BW xi yi] = roipoly(I);
现在您应该忽略代表该区域的BW
,并且只能使用xi
和yi
:
sel = sub2ind( size(I(:,:,1)), yi, xi ); %// convert indices to linear indices
selectedRGB = rI(sel,:); %// will give you the RGB of the corners only.
或者,您可以使用ginput
选择图像中的点。
答案 1 :(得分:0)
此代码使用像素坐标在多边形的角上创建点, 创建感兴趣区域的遮罩,使用BW遮罩创建该区域的灰度图像,然后将灰度区域转换回RGB。 在代码末尾创建的文本文件包含图像的Unit8数据。
是否只需要手动指定文本文件的坐标?
I = imread('image.jpg');
c = [62 95 103 70]; % specify column coordinates (more than 4 if you want)
r = [126 122 193 197]; % specify row coordinates (more than 4 if you want)
BW = roipoly(I,c,r); % convert to binary mask
[R C] = size(BW);
for i = 1:R
for j = 1:C
if BW(i,j) == 1
outputImage(i,j) = I(i,j); % get grayscale image of the specified region
else
outputImage(i,j) = 0;
end
end
end
imtool(outputImage, []); % in imtool you can see that pixels have only one value
rgbBinary = cat(3,outputImage,outputImage,outputImage); % convert grayscale image to binary rgb
finalImage = im2uint8(rgbBinary); % convert image from double binary rgb (0 1) to unit8 256 value rgb
imtool(finalImage) % analyze image using (Inspect pixel values)
for i = 1:R
for j = 1:C
if BW(i,j) == 1
finalImage(i,j,1)=I(i,j,1);
finalImage(i,j,2)=I(i,j,2);
finalImage(i,j,3)=I(i,j,3);
end
end
end
imshow(finalImage) % the specified area in rgb
txtdoc = fopen( 'imageData.txt', 'wt' ); % creates txt file if it doesn't exist or overwrites the existing file
dlmwrite('imageData.txt',finalImage,'delimiter',' ') % writes the data to txt file delimited by space
fclose(txtdoc);