다른 재료의 이미지 분할 문제


15

안녕 이력서 / 패턴 인식 커뮤니티,

이미지 분할과 관련하여 심각한 문제가 있습니다. 시나리오는 내 머릿속을 미치게 만드는 용광로 내의 분위기입니다. 그리고 하나의 특수한 경우가 아니라 짧은 시간 (<10 초)으로 다른 재료 (유리, 세라믹, Al, Ir, ..)의 물체 윤곽을 감지해야합니다. 또한 코드에 대해 순차적 인 픽셀 행의 윤곽이 필요합니다. 따라서 체인 코드 또는 소위 경계 / 윤곽선 추적도 필요하므로 열린 구멍이 좋지 않습니다. 백그라운드에는 때때로 나타나는 먼지, 입자 또는 기타 먼지와 같은 비선형 노이즈가 있습니다.

Matlab 또는 OpenCV 제안을 환영합니다.

더 명확하게하기 위해 목표의 또 다른 이미지와 반투명 물체를 게시했습니다.이 이미지도 감지해야합니다. 또한 알아야 할 추가 예입니다. 예 1 예 2 예 3 예 4

이미지 # 1에서 볼 수 있듯이 이미지의 오른쪽 부분과 별의 외부 윤곽선 근처에 입자가 있습니다. 또한 전체 대비가 그리 좋지 않습니다. 물체 자체는 지하에 있으며 윤곽 감지와 관련이 없습니다. 이미지 # 2는 반투명 객체를 보여줍니다.

다음 화면 (빨간 선)과 같이 해당 객체의 윤곽 / 둘레를 찾고 싶습니다. 두 개의 직사각형 (노란색)은 시작 (왼쪽)과 끝점 (오른쪽)을 표시합니다. 파란색 선은 무시할 수 없습니다. 예 2

처음에는 필터만으로 더러운 분위기의 문제를 해결할 수 있다고 생각했습니다. 그러나 상당한 투자 시간이 지난 후에, 나는 전경과 배경의 대비를 증가시키기 위해 잡음을 크게 줄이거 나 줄여야한다는 것을 깨달았습니다. 히스토그램 이퀄라이제이션, Otsu-adaptive equalization, 선형 필터 (예 : 가우스), 비선형 필터 (중간 값, 확산), 액티브 컨투어, k- 평균, 퍼지 -C- 평균 및 캐니와 같은 많은 방법을 시도했습니다. 형태소 연산자와 결합 된 에지 감지.

  • 캐니 : 입자와 대기가 구멍을 일으키고 있지만 물체의 완전한 윤곽이 필요합니다. 여전히 폐쇄, 형태 연산자의 확장으로 충분하지 않습니다. 캐니는 여전히 히스테리시스로 인해 내가 연구 한 모든 방법 중 최상의 결과를 얻었습니다.
  • 활성 윤곽 : 가장자리 / 그라디언트에서도 작동하며, 개체 내부를 초기화 한 후 완전히 미쳤습니다. 이는 가장자리 맵이 '개방형'개체를 초래하기 때문일 수 있습니다. 내가 아는 한 윤곽을 닫아야합니다. 다른 파생물 (GVF / VFC / Classic Snake)로 시도했습니다.
  • k- 평균 : 안개 배경으로 인해 퍼니스 대기가 결과에 포함됩니다. 퍼지 c 평균도 동일합니다. 객체를 배경에서 분리하기 때문에 두 개의 클러스터를 선택했습니다. 클러스터가 많을수록 결과가 약해집니다.
  • 히스토그램 / 오오 츠 : 매우 가까운 회색 강도 (imho!) 때문에 오브젝트를 배경과 병합합니다. 로컬 및 전역 방법으로 시도했습니다.
  • 필터 : 특히 GLPF 또는 기타 LPF는 가장자리가 번져서 좋지 않아 안개가 자욱한 분위기를 줄이지 않습니다.
  • 비선형 필터는 가장자리를 유지합니다. 큰 이미지를 계산하는 데 시간이 너무 오래 걸립니다. 현재 빠른 양방향 필터를 사용했습니다. 결과는 아래를 참조하십시오.

따라서 객체 세그먼트의 획득 결과가 기존 알고리즘과 경쟁하기 어렵 기 때문에 단일 프로세스로는 후 처리 단계에 충분하지 않습니다. 기존 알고리즘은 매우 로컬이므로이 특별한 시나리오에서 작동합니다.

그래서 만약 당신이 무언가를 완전히 놓쳤다면 당신에게 묻습니다 ... 더 이상 틈이나 구멍없이 가공하는 방법과 어떻게 좋은 윤곽 결과를 얻어야하는지 전혀 알지 못합니다. CCD와 물리적 환경? 미리 감사드립니다!

지금까지의 마지막 접근 방식 (MO로 실험 한 긴 밤 이후) :

  • 양방향 필터 (가장자리를 유지하지만 균일 한 영역을 부드럽게 함)
  • 캐니 (시그마 = 2, 임계 값 = [0.04 0.08])
  • 형태 학적 운영 (MO) : bwareopen, closing, removebridge
  • bwlabel원치 않는 노이즈를 제거하는 윤곽의 둘레 만 선택합니다. 아직 업데이트 된 스크린 샷은 없지만 별표에서 작동합니다. 유리에는 외부 윤곽선에 연결된 내부 윤곽선이 있으며 아래 스크린 샷에서도 볼 수 있습니다.

그래서 외곽 윤곽을 순회하기 위해 특별한 알고리즘이 필요합니다. 이웃의 시계 방향 / 반 시계 방향 조회입니다. 코너 포인트가 있으면 시계 / 반 시계 방향으로 전환 할 수 있습니다. 간격이 있으면 반경을 늘리고 다시보십시오. 다음과 같은 두 가지 이상의 가능한 점이 있으면 이전과 같은 방향을 가진 사람을 선택하십시오. 알고리즘을 따르는 등고선이 의미가 있다고 생각하십니까?

유리의 가장자리 별


적응 임계 값을 사용해 보셨습니까? 당신은 그것을 언급하지 않는 것 같습니다. OTSU는 노이즈를 제거한 후에 어떻게 든 작동해야하지만 적응 임계 값이 더 낫습니다.
Rui Marques

안녕하세요 루이는,이 matlab에 확장에 적응 임계 값을 시도 : 적응 형 임계 값이 여기에 윈도우 매개 변수와 함께 장난의 결과이다 : 첫 번째 시도의 2가 시도 세번째 시도를 (당신이 볼 수 있듯이, 중간 부분이 흰색에서 검은 색으로 간다 증가 매개 변수와 함께 무엇을 imho)가 좋지만 나머지 배경도 검은 색으로 변합니다.
mchlfchr

3
기본적인 이미지 축소 기술을 사용해 보셨습니까? 예를 들어 오른쪽 위의 어두움을 없애기 위해 평평한 필드 교정을 빼는 것 ( en.wikipedia.org/wiki/Flat-field_correction ). 또한 입자가 정적 인 경우 즉시 제거됩니다. 그렇다면 원하는 에지 감지 방법을 사용할 수 있습니다.
PhilMacKay

안녕 필, 내가 아는 한, 물체가 용광로에 들어가기 전에 촬영 된 일련의 사진이 있습니다. 그러므로 교정 종류가 여기에 있습니다. 월요일에 CCD와 환경을 책임지는 물리학 자와 이야기하겠습니다. 그러나 조언에 감사드립니다.
mchlfchr

추가 한 두 번째 이미지는 완전히 다릅니다. 가능한 모든 이미지를 게시 할 수 있습니까?
Andrey Rubshtein

답변:


2

다음을 시도 할 수 있습니다.


희소 메소드에 대한 안녕하세요 oli : 해당 코드의 어떤 메소드를 사용 해야하는지 더 구체적으로 설명 할 수 있습니까? 나는 그 부분에 깊지 않고 노이즈 제거 또는 흐림에 관한 문서에서 도움이되는 것을 찾지 못했습니다 ... 미리 감사합니다.
mchlfchr

1
"사용하기 쉬운"버전을 찾을 수 있습니다. lear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
oli

다른 시간에 불만을 드려 죄송합니다 ;-) ... win32 소스도 있습니까? 다시 감사합니다!
mchlfchr

그렇게하지 affraid 나는 ...이다
OLI

2

임계 값 기술을 너무 일찍 포기했다고 생각합니다. 히스토그램을 살펴보면 분명히 삼단 법입니다. (이미지 오른쪽의 흰색 열을 수동으로 제거했습니다. 이미지의 일부가 아니라고 가정합니다. 코드를 실행하기 전에이 이미지가져 가십시오 )

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

첫 번째 그룹의 모든 값을 살펴보십시오.

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

트라이 모달 히스토그램에서 모드를 찾기 위해 K- 평균 군집화 를 사용할 수 있습니다K=3강도를. 다음 Matlab 코드는 코드에서 찾습니다 th1=67. 아이디어는 3 세트가 있다고 가정하고 각각에 가중치 중심을 계산하는 것입니다. 그런 다음 각 강도 수준이 자체 클러스터에 할당됩니다. 가중치 중심이 이동을 멈 추면 중지합니다. 다음은 이미지에서 히스토그램에 표시된 두 개의 임계 값을 찾은 결과입니다.

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

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

나중에 문제를 해결하는 것은 케이크 한 조각입니다. 개방과 같은 간단한 형태 학적 작업을 수행하십시오.


1
안드레이 안녕,하지만 당신이 언급 한 임계 값을 어떻게 일반화해야합니까? 그뿐만 아니라 여러 경우가 있는데 여전히 자동화가 필요합니다. 그리고 Otsu Thresholding (matlab의 기능)은 나에게 좋은 결과를주지 못했습니다. 더 힌트가 있습니까? 종류에 관한
mchlfchr

다시 한 번 감사드립니다.하지만 코드가 작동하지 않습니다. 빈 그림 화면이 나타납니다. 내 원래 데이터 (비트 맵)와 위에서 게시 한 PNG로 시도했습니다. 나는 그 동안 디버깅하고 있습니다 ...
mchlfchr

@ mchlfchr, 이미지 처리 도구 상자가 있습니까? 그렇지 않으면 다음과 같이 변경할 imhist수 있습니다.hist
Andrey Rubshtein

@mchlfchr, 업데이트 된 버전을 참조하십시오
Andrey Rubshtein

Andrey, 원본 비트 맵 파일을 삽입하면 원래 게시물에서 언급 한대로 결과가 나타납니다. 어쩌면 이것이 해결에 관한 것입니까? 소스 이미지는 576x768 픽셀 및 회색조 (256)입니다. 원래 이미지로 함수를 사용하는 경우 결과는 다음과 같습니다. i.imgur.com/UXALJ.png 함수의 히스토그램 그림 : i.imgur.com/7RiPP.png 도움을 주셔서 감사합니다! 안부
mchlfchr

1

위에서 제안한 바와 같이, 임계 값은이 이미지에서 매우 효과적 일 수 있는데, 불규칙한 조명 때문에 일정한 임계 값이 적용되지 않는 것을 제외하고는 본질적으로 바이너리입니다. 적응 임계 값이 필요합니다.

내 조언은 밝은 영역에서 적은 수의 값을 샘플링하여 간단한 모델 (평면 [3 DOF] 또는 2 차 [6 DOF])을 사용하여 백그라운드 재구성을 수행하는 것입니다. 가장 좋은 방법은 노이즈를 평균화하기 위해 작은 ROI를 사용하는 것입니다. 그런 다음 배경 값을 빼거나 나눠서 음영을 수정하십시오.

휴먼 인터랙션이 옵션이 아닌 경우 먼저 Otsu를 직선화하고 임계 값 아래에서 균일 한 ROI (낮은 분산)를 고려하여 백그라운드 영역 검색을 자동화 할 수 있습니다. 첫 번째 배경 재구성 후이 프로세스를 평평한 이미지에 적용하여 향상시킬 수 있습니다.

전체 프로세스는 1 초 미만으로 실행되도록 구현할 수 있습니다.


안녕하십니까, 자동화 된 처리가 선호됩니다. DOF 측면은 흥미롭지 만 Otsu 자체가 제대로 작동하지 않기 때문에 Otsu 방법에 대해 잘 모르겠습니다. 이미지의 임의의 영역을 선택하고 선택한 모든 영역의 평균 값을 기준으로 임계 값을 지정한다는 것을 이해하고 있습니까? 종류에 관한
mchlfchr

1

가장 좋은 방법은 활성 윤곽을 사용하는 것입니다. 어떤 활성 컨투어가 YouTube에있는 비디오인지 살펴 보지 못하는 경우 http://www.youtube.com/watch?v=ijNe7f3QVdA

기본적으로 u 초기화 세그먼트를 제공해야하며 모양이 향상됩니다. 내 제안은이 게시물에서 논의 된 방법 중 하나에 대한 것이며 활성 윤곽선을 2 단계로 사용합니다. 개선 단계로.

다음은 http://www.mathworks.com/matlabcentral/fileexchange/19567를 사용할 수있는 활성 윤곽의 구현입니다 .


dsp.se에 오신 것을 환영합니다 :) 기여해 주셔서 감사합니다. 더 좋게 만들고 싶다면 다음 질문에 대한 답변을 제공하는 것이 흥미로울 것입니다. 왜 이것이 최선의 접근 방법이라고 생각하십니까 (예 : tecnhique에 대한 개인적인 경험이 있습니까)? 이미 제안 된 접근법 중 어떤 것이 귀하의 제안과 함께 잘 작동한다고 생각하십니까? 기술에 대한 간단한 설명을 제공하거나 시간이 있다면 제공된 예제 이미지의 기술을 사용하여 실험 결과를 제공하십시오. 그리고 DSP에서 재미있게 보내십시오!
penelope

@mkuse, 초기 게시물을 읽었을 수도 있지만 이미 노이즈 감소 및 에지 맵과 함께 활성 윤곽을 시도했습니다. 큰 이미지의 경우 결과가 나쁘고 런타임이 좋지 않았습니다.
mchlfchr

노이즈 감소 기술을 살펴보십시오. 당신은 여기에 대한 요약을 찾을 수 있습니다 lnmiitdip.files.wordpress.com/2011/12/...
mkuse

1
@ mkuse, 나는 당신이 내 초기 게시물에서 PPT 파일에 게시 한 메커니즘을 이미 언급했습니다. 내가 사용했던 필터 종류를보다 명확하게하기 위해 초기 게시물을 편집했습니다.
mchlfchr

0

당신은 당신이 무슨 일인지 분명히 알고 있지만 임계 값 사용에 대해 언급하지 않았으며, 특히 Otsu를 사용하여 올바른 수준을 계산 한 다음 윤곽선을 찾고 가장 큰 선택을 시도하는 전역 임계 값을 적용하려고 했습니까?

[명확하게 편집하기]

이미지 전체에 시각적으로 표시되어 글로벌 임계 값이 작동하지 않습니다.

나는 이것으로 빨리 놀았고 이미지를 6 덩어리로 나누면 (3 열의 2 행은 동일한 크기), Otsu를 사용하여 임계 값을 수행 한 다음 다시 조립하면 청소하는 데 꽤 신의 역할을합니다. 영상.

별의 오른쪽 상단에는 여전히 약간의 작은 유물이 있습니다.

객체에 직선 경계가 있기 때문에 이러한 가장자리를 추출하고 정점을 찾기 위해 교차하여 결과를 객체 윤곽으로 사용하기 위해 Hough 변환을 고려할 수 있습니다.


안녕 Dave, 나는 Otsu를 시도했지만 오른쪽 상단 배경이 객체와 병합되는 효과를 가져옵니다.
mchlfchr

안녕 Dave, Hough는 런타임 요구 사항으로 인해 옵션이 아니며 HT에 대한 지식이있는 한 큰 이미지에는 시간이 많이 걸립니다.
mchlfchr

0

외곽선이 항상 직선이거나 알려진 곡선입니까?

그렇다면 가장자리를 따라 각 픽셀을 얻으려고하는 대신 Hough 변환을 사용하여 선의 방정식을 얻은 다음 선과 itnersections에서 카운트를 다시 만듭니다.


1
이미 언급했듯이 근처에 실시간 접근이 필요합니다. 그리고 HT를 아는 한, 시간이 많이 걸립니다. 또 다른 측면은 곡선을 모르고 선이 항상 직선이 아니라는 것입니다. 컨투어는 퍼니스에있는 재료에 따라 다릅니다 (자세한 내용은 원산지 포스트 참조).
mchlfchr

당신이 해당 있었던 파라미터 공간 검색 할 수 있습니다 직선의 경우는 꽤 빨리, 그리고 당신이 대략 알고있는 경우 행은 (이전 프레임에서 예를)있는 곳
마틴 베켓
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.