Fix out-of-gamut RGB colors

조회 수: 2(최근 30일)
Roger Breton
Roger Breton 2022년 3월 31일
편집: DGM 2022년 4월 1일
I'm going in circle... I have this code, which converts from Lab to RGB :
rawRGB = lab2rgb(Lab,'WhitePoint','d50')
Trouble is, there are loads of RGB colors that are out of gamut and come out with either negative values or values greater than one.
So I use this code to hunt down for out-of-gamut values :
isoog_1 = any(rawRGB>1 ,3);
isoog_0 = any(rawRGB<0 ,3);
But I'm lost when it comes time to use this information to substitue out-of-gamut colors in my rawRGB matrix for 0s and 1s. I tried this :
rawRGB(repmat(isoog_1,[1 1 3])) = 1;
rawRGB(:,4:9) = []
rawRGB(repmat(isoog_0,[1 1 3])) = 0;
rawRGB(:,4:9) = []
But I must be doing something 'illegal' which I can't figure out, because I get this error :
Attempt to grow array along ambiguous dimension.
This logic worked perfectly fine on this code though (I extracted row 1062 from the Lab matrix to experiment with) :
Test = Lab(1062,:) % 7.5PB 4/26
% Test = 38.57 54.97 -100.01
TestRGB = lab2rgb(Test,'WhitePoint','d50')
% TestRGB = 0.2537 0.2216 1.0216
isoog_1 = any(TestRGB>1 ,3);
isoog_0 = any(TestRGB<0 ,3);
TestRGB(repmat(isoog_1,[1 1 3])) = 1;
TestRGB(:,4:9) = []
TestRGB2 = [0.34 -0.34 0.98]
isoog_0 = any(TestRGB2<0 ,3);
TestRGB2(repmat(isoog_0,[1 1 3])) = 0;
I guess I don't see how to go about conditionnaly substituting values inside a matrix...
Any help is appreciated.

채택된 답변

Stephen23
Stephen23 2022년 3월 31일
편집: Stephen23 2022년 3월 31일
Simpler and much more efficient:
rawRGB = max(0,min(1,rawRGB));
  댓글 수: 1
Roger Breton
Roger Breton 2022년 3월 31일
Wow! Thank YOU!

댓글을 달려면 로그인하십시오.

추가 답변(1개)

Roger Breton
Roger Breton 2022년 3월 31일
I think I found a solution, alhough it is not elegant... :
rawRGB = lab2rgb(Lab,'WhitePoint','d50')
TempR = rawRGB(:,1)
TempR(TempR>1)=1
TempR(TempR<0)=0
TempG = rawRGB(:,2)
TempG(TempG>1)=1
TempG(TempG<0)=0
TempB = rawRGB(:,3)
TempB(TempB>1)=1
TempB(TempB<0)=0
rawTemp = [TempR TempG TempB ]
It beats looping over 2700 elements to find negative and greater than 1 values....
  댓글 수: 3
DGM
DGM 2022년 4월 1일
I mentioned MIMT maxchroma() earlier. That would allow you to find the gamut extents in LCHab and then simply clamp chroma prior to conversion. It might not be the universally best approach, but it at least keeps colors from migrating to the corners of the RGB cube during truncation. In practice, you wouldn't need to use it directly, as MIMT lch2rgb() uses it internally when the 'truncatelch' option is specified.
EDIT: wait. If you're using d50, then maxchroma won't work. I never bothered to set it up for d50, but there's no reason that the same approach couldn't be used.

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

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

Start Hunting!

Translated by