이미지에서 그림자를 어떻게 제거 할 수 있습니까?


17

이 이미지가 있습니다

여기에 이미지 설명을 입력하십시오

이미지에서 그림자를 제거하고 싶습니다. 그림자를 제거하기 위해 특정 형태학 연산과 같은 다양한 방법이 사용되었습니다.

동일한 이미지에이 마스크를 만들었습니다

여기에 이미지 설명을 입력하십시오

내가 만든이 마스크를 사용해 볼 수있는 다른 방법이 있습니까?

편집 :

요청한 것과 동일한 크기의 입력 이미지와 마스크 :

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

편집 2 : 1D 불변 이미지를 생성했지만 완벽하지는 않습니다.

  I = imread('shadow.jpg');
       J = im2double(I);

      R = J(:,:,1);
      G = J(:,:,2);
      B = J(:,:,3);

     [len,wid] = size(R);

     % Generation of 2-D Log Chromaticity Image.
     for i = 1:len
        for j = 1:wid
           if ((R(i,j)*G(i,j)*B(i,j))~= 0)
              c1(i,j) = R(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c2(i,j) = G(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c3(i,j) = B(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
           else
              c1(i,j) = 1;
              c2(i,j) = 1;
              c3(i,j) = 1;
        end
    end
end

rho1 = mat2gray(log(c1));
rho2 = mat2gray(log(c2));
rho3 = mat2gray(log(c3));

X1 = mat2gray(rho1*1/(sqrt(2)) - rho2*1/(sqrt(2)));                                         %(1/sqrt(2); -1/sqrt(2); 0)
X2 = mat2gray(rho1*1/(sqrt(6)) + rho2*1/(sqrt(6)) - rho3*2/(sqrt(6)));   %(1/sqrt(6); 1/sqrt(6); -2/sqrt(6))

theta = 120;

InvariantImage = cos(theta*pi/180)*X1 + sin(theta*pi/180)*X2;
imagesc(InvariantImage); colormap(gray)

여기에 이미지 설명을 입력하십시오

내가 여기서 뭘 잘못하고 있는지 이해할 수 없다면 도와주세요?


좋은 질문! 마스크 영역에서 밝기를 높이려고 했습니까?
Dima

5
내 대답을 확인하십시오 : dsp.stackexchange.com/questions/454/…
datageist

간단히 말해서, 두 개의 서로 다른 표면의 반사율은 절대적인면과 직접 및 간접 광을 반사하는 방식이 다릅니다. 그래서 그들은 그림자에있는 것에 다르게 반응하고 그림자를 취소하기 위해 다른 공식이 필요합니다.
Daniel R

2 차 도함수를 사용한 엣지 감지, 그래디언트 사용 및 라플라시안 연산자와 같은 다른 방법이 있습니다.

답변:


11

섀도우 감지, 섀도우 마스크 생성, 실제로는 이전 게시물에서 언급 한 것과 같은 섀도우를 실제로 제거하는 수십 개의 출판물이 있습니다. 필요한 경우 목록에 일부를 추가 할 수 있습니다. 그러나 문제는 IMHO가 해결되지 않는 것입니다. 빠른 시작을 위해 섀도우 마스크를 고려할 때 다음 두 가지 접근 방식을 제안하고 과거에 시도했습니다. 그것들은 그림자를 확실히 줄입니다-항상 매끄럽지는 않지만 비슷한 방식으로 그림자 제거를 다루는 출판물이 있습니다.

  • 여기에 설명 된 그라디언트 도메인 조작 기법 (제공된 C 및 Matlab 코드) : http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html 그라디언트 통합 방식은 다양한 이미지 처리에 사용될 수 있습니다. 문제가 발생하면 슬라이드 / 프레젠테이션을 참조하십시오.

    일반적인 아이디어 :

    1. 모든 색상 채널에 대한 공간 미분 (그라데이션 이미지)을 계산합니다.
    2. 섀도우 마스크에서 섀도우 경계를 사용하여 섀도우 경계에서 0에 가까우며 쉐도우 에지를 따라 지정된 인접 영역 내에서, 즉 주어진 엣지 포인트에 직교하는 가중치 마스크를 생성하십시오.
    3. (2.)의 가중치 마스크에 모든 그라디언트 이미지를 곱하여 그림자 경계 / 가장자리를 줄이거 나 줄입니다.
    4. 위 링크의 코드를 사용하여 그라디언트 이미지를 통합하십시오.
    5. RGB 이미지의 경우 경험상 원본 이미지의 개별 채널 평균을 계산하고 이러한 값에 맞게 통합 이미지를 조정하여 "재미있는"색상 인공물을 방지합니다.
  • 원본 이미지 도메인의 밝기 조작.

    1. 그림자 마스크를 사용하여 외부 그림자 영역 중 하나 인 그림자 마스크를 생성하고 그림자 경계를 가로 질러 부드럽게 전환 (위쪽)하며 그림자 영역 내부에 하나 이상의 스케일 팩터를 갖습니다. 이전 포스트에서 제안했듯이, 그림자-영역의 평균-밝기와 함께 평균-밝기를 사용하여 그림자-영역을 바로 둘러싼 영역에서 스케일 팩터를 추정 할 수 있습니다.
    2. 클리핑에 따라 원본 이미지 (채널당)에 가중치 마스크를 곱하십시오.

또한 휘도 또는 밝기를 직접 나타내는 다른 색상 모델 (예 : HSV)을 사용하여 시도한 후 색상 (채도 / 채도)에 관계없이 수정할 수 있습니다. 이것은 기본적으로 밝기 조작과 같이 작동합니다. 즉, 부드러운 가중치 마스크를 생성하고 휘도 채널과 곱합니다. 그라디언트 통합 및 밝기 조작과 같은 두 가지 접근 방식을 영리하게 결합 할 수는 있지만 누군가가 전에 시도했을 수도 있습니다.

친절하게 도와 주길 바래, 데릭


2
링크가 작동하지 않는 것 같습니다. 여기에 캐시 된 버전이 있습니다.
Delgan

9

나는이 이미지를 전에 보았습니다. 사실 여기 당신이 해결하고자하는 주제에 관한 논문이 있습니다. Simon Fraser University의 동일한 연구 그룹의 다른 논문 을 추적했습니다 . 이 두 가지 모두 조명 불균형에 대한 색상 해결 문제에 대한 좋은 소개를 제공합니다.


네, 알고 있지만 같은 문제에 대해 다른 방법을 시도하고있었습니다
vini

@vini : 당신이 무엇에 반대하는지 알아야한다는 것을 읽었다면 ---- 간단한 형태소 연산이 그것을 자르지 않을 것입니다. 무엇을 읽고 시험해 보셨습니까? 필요한 경우 다른 서류를 제안 할 수 있습니다.
Emre

@Emre 나는 그림자의 효과가 많은 성공을 줄이지 않도록 밝기를 변경하려고 노력하고 있습니다. .. 어쩌면 가장자리 맵을 사용 하여이 그림자를 가리는 데 사용할 수 있습니까?. 그렇습니다. (matlab) 그림자를 제거하기
vini

5
@vini :이 문제는 단일 라이너 솔루션을 넘어선 것입니다. 링크 된 논문 (그리고 다른 것들도 있습니다)은 대부분의 경우 이미 문제를 해결하므로 새로운 것을 원한다면 약점을 찾아야하며, 그 점을 잘 이해해야하므로 다시 읽으십시오. 조심스럽게. 일반적으로 토론 및 결론 섹션에서 문제를 언급합니다. 로그 색도 조명 불변 투영법은 나에게 가장 유망한 것으로 보인다 ...
Emre

4

그림자 감지에 대해 말하는 몇 가지 방법이 기본적으로 알려진 배경에서 작동합니다. 픽셀 색상 만보고 그림자 가 무엇인지에 대한 절대적인 개념은 없습니다 . 그러나 참조없이 그림자를 식별해야합니다.

이 문제는 어렵지만, 여기에는 사소한 해결책이 있습니다. 비록 이것이 최선의 방법은 아니지만 어쨌든 그것은 약간의 관점을 얻는 데 도움이 될 수 있습니다.

HSL 도메인의 이미지 구성 요소를 살펴 보겠습니다

색조색조 구성 요소,
포화채도 구성 요소 및 가벼움밝기 구성 요소

명도는 이미지의 회색과 거의 일치하며 그림자는 기본적으로 잘 알려져 있습니다.

장면 반사가 국소 감쇠를 겪는 반투명 영역.

에서 여기 .

따라서 이미지의 회색 부분에서 동일하게 식별 할 수있는 암흑의 반사율을 줄이는 오버레이입니다. 그러나 색상 부분 (색조 및 다소 채도)에서는 상호 작용이 훨씬 적습니다.

이제 여기에서 두 개의 이미지를 만들 수 있습니다.

  1. 이 첫 번째 이미지에서 밝기 구성 요소를 제거했습니다 (고정 평균값으로 대체 됨)
    여기에 이미지 설명을 입력하십시오

  2. 두 번째 이미지에서 같은 방식으로 채도 컴포넌트를 제거했습니다 채도 제거

밝기는 유지되지만 채도는 제거 되더라도 그림자에 대한 중요한 정보는 그대로 유지됩니다. 밝기를 제거 할 때 그림자 정보가 크게 떨어집니다. 완벽하지는 않지만 그림자가 실제로 배경과 구별되는 핵심 기능을 만듭니다.

이를 바탕으로 "조명 제거"이미지를 배경으로 처리하고 다른 이미지를 입사 이미지로 처리하고이 두 정보에 따라 이미지를 분할 할 수 있습니다. 따라서 그림자가 큰 역할을하지 않는 지역에서는 그림자가 존재할 때 그 세그먼트가 높은 오류를 나타내는 곳에서 차이가 훨씬 적을 수 있습니다.

또는 두 이미지 모두에 독립적 인 분할 (예 : 영역 증가)을 적용 할 수 있습니다. 채도 제거 이미지에는 그림자 세그먼트에 불과한 명도 제거 이미지에 존재하지 않는 추가 세그먼트가 있습니다.

참고 : HSL 밝기가 제거 된 이미지를 원본과 구별 할 수 있습니다. 또한 YCbCr뿐만 아니라 HSV 색상 공간과 비슷한 것을 시도하십시오.


2

마스크 영역 (그림자)의 히스토그램을 촬영하고 선형 색상 변환을 적용하여 마스크 영역과 나머지 이미지의 히스토그램을 일치시킬 수 있습니다.

나는 변환의 스케일 팩터가 무시할 만하다고 생각하고, 밝기의 shifing 만 필요할 것이므로 두 세그먼트 (그림자, 서라운드)의 평균 밝기를 취하고 차이를 적용 할 수 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.