Can I use grayscale image in Lab color space

6 ビュー (過去 30 日間)
S.M.
S.M. 2018 年 8 月 29 日
コメント済み: S.M. 2018 年 9 月 5 日
Hello, i tried one image processing tutorial, which i found on YouTube. Basically it's about segmentation of salami pieces on a pizza. For that i have to convert an RGB-image into the CIELAB color space and define different classes. This code works perfectly fine.
Now my question is: Can I use this script to segment things from a gray-scale image? Or do I have to convert the grayscale image into the RGB format?
Here the code:
% Load picture
img = imread('Pizza.jpg');
% Show original pic
subplot(4,3,1);
imshow(img);
% Convert into lab
labimg = rgb2lab(img);
% Adjust and show color channels
subplot(4,3,2);
imshow(labimg(:,:,1),[]);
subplot(4,3,3);
imshow(labimg(:,:,2),[]);
subplot(4,3,4);
imshow(labimg(:,:,3),[]);
% Define classes
salami = labimg(508:603, 200:305, :);
tomato = labimg(634:729, 326:457, :);
plate = labimg(645:708, 615:699, :);
backgr = labimg(3:56, 5:53, :);
% Save averages from classes in a matrix
classes = [[mean2(salami(:,:,2)), mean2(salami(:,:,3))]', [mean2(tomato(:,:,2)), mean2(tomato(:,:,3))]', [mean2(plate(:,:,2)), mean2(plate(:,:,3))]', [mean2(backgr(:,:,2)), mean2(backgr(:,:,3))]'];
[height, width, channels] = size(labimg);
classimg = zeros(height,width);
for i = 1:height
for j = 1:width
classimg(i,j) = nearestNeighbour2d(labimg(i,j,2:3), classes);
end
end
% Show class-image
subplot(4,3,5);
imshow(classimg, []);
% Extraction of salami
salamiclass = (classimg ==1);
salamiclass = double(salamiclass);
subplot(4,3,6);
imshow(salamiclass, []);
% Use erode
se = strel('disk',28);
erodedBW = imerode(salamiclass, se);
subplot(4,3,7);
imshow(erodedBW, []);
% Extraction of the regioons
labels = bwlabel(erodedBW);
subplot(4,3,8);
imshow(labels, []);
numLabels = max(max(labels));
regions = zeros(5,numLabels);
for ii = 1:numLabels
[xx, yy] = find(labels==ii);
regions(1:5,ii) = [min(yy) min(xx) max(yy) max(xx) size(xx,1)]';
end
circles = zeros(numLabels,3);
for ii=1:numLabels
circles(ii,1:3) = [regions(3,ii)-(regions(3,ii)-regions(1,ii))/2 regions(4,ii)-(regions(4,ii)-regions(2,ii))/2 max([regions(3,ii)-regions(1,ii) regions(4,ii)-regions(2,ii)])];
end
img = draw('Circles', img, circles, [0 0 255], 5);
subplot(4,3,9);
imshow(img, []);
  1 件のコメント
Stephen23
Stephen23 2018 年 9 月 5 日
S.M.'s "Answer" moved here:
Nobody an idea?

サインインしてコメントする。

採用された回答

Walter Roberson
Walter Roberson 2018 年 9 月 5 日
In theory it would be possible to calculate the L component directly knowing the grayscale value and making assumptions about the whitepoint . The a and b components would both be 0 for true grayscale. You would use that code to replace the labimg = rgb2lab(img); call.
In practice, it is far easier just to code
labimg = rgb2lab( repmat(img, [1 1 3]) );
  1 件のコメント
S.M.
S.M. 2018 年 9 月 5 日
Thank you Walter, I'm much further now. I'll try it with another picture. Let's see what happens. Thanks again!

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by