如何在matlab中将roipoly选择的点的RGB值写入文本文件?

时间:2016-02-21 10:23:23

标签: matlab image-processing

我做了:

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);

2 个答案:

答案 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,并且只能使用xiyi

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);