Vấn đề phân đoạn hình ảnh của các vật liệu khác nhau


15

Xin chào CV / Cộng đồng nhận dạng mẫu,

Tôi đã có một vấn đề nghiêm trọng liên quan đến việc phân chia hình ảnh. Kịch bản là một bầu không khí trong một cái lò làm cho đầu tôi phát điên. Và tôi cần phát hiện các đường viền đối tượng của các vật liệu khác nhau (thủy tinh, gốm sứ, Al, Ir, ..) trong một khoảng thời gian ngắn (<10 giây) và không chỉ trong một trường hợp đặc biệt. Tôi cũng cần đường viền trong một hàng pixel liên tiếp cho mã. Do đó, một mã chuỗi hay còn gọi là đường viền / đường viền cũng cần thiết, vì vậy các lỗ mở không tốt. Trong nền là những tiếng ồn phi tuyến tính, xấp xỉ bụi, hạt hoặc phần nào khác, thỉnh thoảng xuất hiện.

Đề xuất Matlab hoặc OpenCV đều được chào đón.

Để làm cho nó rõ ràng hơn, tôi đã đăng một hình ảnh khác về mục tiêu của tôi và một đối tượng nửa trong suốt, cũng cần phải được phát hiện. Ngoài ra các ví dụ khác cần được nhận thức. ví dụ 1 ví dụ2 ví dụ3 ví dụ4

Như bạn có thể thấy trong Hình ảnh số 1, có các hạt ở phần bên phải của hình ảnh và gần đường viền ngoài của ngôi sao, đó là vật thể. Ngoài ra độ tương phản tổng thể là không tốt. Bản thân vật thể đứng dưới lòng đất, không liên quan đến việc phát hiện đường viền. Hình ảnh # 2 cho thấy một đối tượng bán đôi, cũng có thể.

Tôi muốn tìm đường viền / chu vi của đối tượng đó, như trên màn hình tiếp theo (đường màu đỏ). Hai hình chữ nhật (màu vàng) đang đánh dấu điểm bắt đầu (trái) và điểm kết thúc (phải). Các dòng màu xanh là không thể biết được. ví dụ2

Lúc đầu, tôi nghĩ rằng tôi có thể giải quyết vấn đề của bầu không khí bẩn thỉu đó chỉ bằng các bộ lọc. Nhưng sau một loạt thời gian đầu tư đáng kính, tôi mới nhận ra rằng mình phải giảm bớt hoặc giảm tiếng ồn đáng kể để tăng độ tương phản của tiền cảnh và hậu cảnh. Tôi đã thử rất nhiều phương pháp, như cân bằng biểu đồ, cân bằng thích ứng Otsu, bộ lọc tuyến tính (ví dụ gauss), bộ lọc phi tuyến (trung vị, khuếch tán), Đường viền hoạt động, Phương tiện k, Phương tiện mờ và Canny cho thuần túy Phát hiện cạnh kết hợp với các toán tử hình thái.

  • Canny: Các hạt và bầu khí quyển đang gây ra lỗ hổng, nhưng tôi cần một đường viền hoàn chỉnh của vật thể. Vẫn với việc đóng cửa, nới rộng các toán tử hình thái, nó không đủ tốt. Canny vẫn có kết quả tốt nhất trong tất cả các phương pháp tôi đã nghiên cứu vì độ trễ.
  • Đường viền hoạt động: Chúng cũng hoạt động trên các cạnh / độ dốc, chúng hoạt động hoàn toàn điên rồ sau khi khởi tạo bên trong đối tượng, điều này có thể do bản đồ cạnh dẫn đến đối tượng 'mở'. Theo tôi biết đường viền phải được đóng lại. Đã thử nó với các dẫn xuất khác nhau (GVF / VFC / Rắn cổ điển).
  • k-Means: Kết quả bao gồm không khí lò, vì nền sương mù. Tương tự cho phương tiện mờ. Tôi chọn hai cụm, vì tách đối tượng khỏi nền. Nhiều cụm dẫn đến kết quả yếu hơn.
  • Biểu đồ / Otsu: Vì cường độ màu xám rất gần (imho!), Nó hợp nhất đối tượng với nền. Đã thử nó với các phương pháp địa phương và toàn cầu.
  • Bộ lọc: Đặc biệt GLPF hoặc LPF khác đang làm nhòe các cạnh, điều này không tốt lắm và thậm chí không làm giảm bầu không khí sương mù.
  • Bộ lọc phi tuyến tính đang bảo tồn các cạnh. Hầu hết chúng mất quá nhiều thời gian để tính toán các hình ảnh lớn. Mất một bộ lọc song phương nhanh chóng cho bây giờ. Kết quả xem bên dưới.

Do đó, không một phương thức nào đủ tốt cho các bước xử lý hậu kỳ, bởi vì kết quả thu được của phân khúc đối tượng kém cạnh tranh với một thuật toán hiện có. Thuật toán hiện có là rất cục bộ và do đó nó hoạt động cho kịch bản rất đặc biệt này.

Vì vậy, tôi đang hỏi bạn, nếu tôi đã bỏ lỡ điều gì đó hoàn toàn ... Tôi không biết làm thế nào để xử lý và làm thế nào tôi có được kết quả đường viền tốt, mà không có lỗ hổng hay lỗ hổng .. Có thể không có nhiều thay đổi trên CCD và môi trường vật lý? Cảm ơn trước!

Cách tiếp cận cuối cùng cho đến nay (sau một đêm dài thử nghiệm với MO):

  • Bộ lọc song phương (bảo tồn cạnh, nhưng làm mịn các khu vực đồng nhất)
  • Canny (Sigma = 2, Ngưỡng = [0,04 0,08])
  • Hình thái hoạt động (MO): bwareopen, closing, remove&bridge
  • bwlabelchỉ chọn chu vi của đường viền, loại bỏ các tạp âm không mong muốn. chưa có ảnh chụp màn hình cập nhật nào, nhưng nó hoạt động cho ngôi sao. các mảnh kính có một đường viền bên trong được kết nối với đường viền bên ngoài, cũng có thể được nhìn thấy trên ảnh chụp màn hình bên dưới.

Vì vậy, tôi sợ rằng tôi cần một thuật toán đặc biệt để duyệt qua đường viền bên ngoài. Nó sẽ là một số tra cứu theo chiều kim đồng hồ / ngược chiều kim đồng hồ của khu phố. Bước theo chiều kim đồng hồ / ngược chiều kim đồng hồ có thể chuyển đổi, nếu có một điểm góc. nếu có một khoảng trống, tăng bán kính và nhìn lại. nếu có hai hoặc nhiều điểm sau có thể, hãy chọn người có cùng hướng với điểm trước. Bạn có nghĩ rằng, thuật toán theo đường viền có ý nghĩa?

Cạnh kính Ngôi sao


Bạn đã thử ngưỡng thích ứng chưa? Bạn dường như không đề cập đến nó. Tôi nghĩ OTSU nên hoạt động bằng cách nào đó sau khi loại bỏ tiếng ồn nhưng có lẽ ngưỡng thích nghi là tốt hơn.
Rui Marques

Xin chào, tôi đã thử ngưỡng thích ứng với tiện ích mở rộng Matlab này: Ngưỡng thích ứng Dưới đây là kết quả để chơi xung quanh với các tham số cửa sổ: Lần thử thứ 2 Thử lần thứ 3 Thử như bạn có thể thấy, với việc tăng các tham số, phần giữa chuyển từ màu trắng sang màu đen là tốt, imho) nhưng phần còn lại của nền cũng biến thành màu đen, những gì là xấu.
mchlfchr

3
Bạn đã thử một số kỹ thuật giảm hình ảnh cơ bản? Chẳng hạn như trừ đi một hiệu chỉnh trường phẳng để loại bỏ sự tối màu đó ở phía trên bên phải ( en.wikipedia.org/wiki/Flat-field_correction ). Ngoài ra, nếu các hạt tĩnh, chúng sẽ bị loại bỏ ngay lập tức. Sau đó, bạn có thể sử dụng bất kỳ phương pháp phát hiện cạnh nào bạn muốn ...
PhilMacKay

Xin chào Phil, theo như tôi biết và theo tôi biết, có một loạt hình ảnh được chụp trước khi một vật thể vào lò. Loại hiệu chuẩn là do đây. Tôi sẽ nói chuyện với nhà vật lý chịu trách nhiệm về CCD và môi trường vào thứ hai. Nhưng cảm ơn vì lời khuyên, tôi sẽ cho nó một shot!
mchlfchr

Hình ảnh thứ hai bạn thêm trông hoàn toàn khác nhau. Bạn có thể đăng tất cả các hình ảnh có thể?
Andrey Rubshtein

Câu trả lời:


2

Bạn có thể thử như sau:


Xin chào oli, liên quan đến các phương thức thưa thớt: bạn có thể nói cụ thể hơn về những phương pháp của mã đó tôi nên sử dụng không? Tôi không hiểu sâu về phần đó và tôi đã không tìm thấy điều gì hữu ích trong các tài liệu liên quan đến khử nhiễu hoặc làm mờ ... Cảm ơn bạn trước.
mchlfchr

1
Bạn có thể tìm thấy phiên bản "dễ sử dụng hơn", tại đó: lear.inrialpes.fr/people/mairal/denoir_ICCV09.tar.gz
oli

xin lỗi để khiếu nại lần khác ;-) ... bạn có nguồn win32 không? cám ơn bạn một lần nữa!
mchlfchr

Tôi sợ rằng tôi không ...
oli

2

Tôi nghĩ rằng bạn đã từ bỏ các kỹ thuật ngưỡng quá sớm. Hãy nhìn vào biểu đồ của bạn, nó rõ ràng là ba chế độ: (Tôi đã xóa các cột màu trắng ở bên phải hình ảnh của bạn bằng tay, tôi cho rằng chúng không phải là một phần của hình ảnh - vui lòng chụp ảnh này trước khi chạy mã của tôi)

nhập mô tả hình ảnh ở đây

Hãy xem tất cả các giá trị trong nhóm đầu tiên:

nhập mô tả hình ảnh ở đây

Để tìm các chế độ trong biểu đồ ba phương thức, có thể sử dụng phân cụm K-nghĩa với K=3cường độ. Mã Matlab sau đây tìm thấy th1=67trên mã của bạn. Ý tưởng là giả định rằng bạn có 3 bộ và tính toán trọng số trên mỗi bộ. Sau đó, mỗi mức cường độ được gán cho cụm riêng của nó. Bạn dừng lại khi trọng tâm ngừng di chuyển. Đây là kết quả của việc tìm hai ngưỡng trên hình ảnh của bạn, được hiển thị trên biểu đồ.

nhập mô tả hình ảnh ở đây

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

Giải quyết vấn đề sau đó là một miếng bánh, chỉ cần thực hiện một số thao tác hình thái đơn giản, như mở.


1
Xin chào, nhưng tôi nên làm thế nào để khái quát về cái ngưỡng mà bạn đã đề cập? Tôi đã có một vài trường hợp, không chỉ một và tôi vẫn cần tự động hóa. Và Otsu Thresholding (chức năng trong matlab) cho tôi không có kết quả tốt. Còn gợi ý nào nữa không? Trân trọng
mchlfchr

Xin chào lần nữa, cảm ơn cho đến nay, nhưng mã không hoạt động. Màn hình trống xuất hiện. Đã thử nó với dữ liệu gốc của tôi (bitmap) và PNG bạn đã đăng ở trên. Tôi đang gỡ lỗi trong khi đó ...
mchlfchr

@mchlfchr, bạn có hộp công cụ xử lý ảnh không? Nếu bạn không, có thể đổi imhistthànhhist
Andrey Rubshtein

@mchlfchr, vui lòng xem phiên bản cập nhật
Andrey Rubshtein

Nếu tôi chèn tệp bitmap gốc, kết quả sẽ như tôi đã đề cập trong bài đăng gốc. Có lẽ điều này đang xảy ra liên quan đến nghị quyết? Hình ảnh nguồn là 576x768 pixel và thang độ xám (256). Đây là kết quả, nếu tôi sử dụng chức năng của bạn với hình ảnh gốc của mình: i.imgur.com/UXALJ.png biểu đồ-hàm của chức năng của bạn: i.imgur.com/7RiPP.png Cảm ơn sự giúp đỡ của bạn! liên quan
mchlfchr

1

Như đã đề xuất ở trên, ngưỡng có thể rất hiệu quả trên hình ảnh này, về cơ bản là nhị phân, ngoại trừ việc một ngưỡng không đổi sẽ không làm được vì ánh sáng không đồng đều. Bạn cần ngưỡng thích ứng.

Lời khuyên của tôi sẽ là tái tạo nền bằng một mô hình đơn giản (có thể là mặt phẳng [3 DOF] hoặc tứ giác [6 DOF]), bằng cách lấy mẫu một số lượng nhỏ các giá trị trong vùng ánh sáng. Tốt nhất là sử dụng ROI nhỏ để giảm tiếng ồn. Sau đó sửa màu bằng cách trừ (hoặc chia cho) các giá trị nền.

Nếu tương tác của con người không phải là một tùy chọn, bạn có thể tự động tìm kiếm các khu vực nền bằng Otsu thẳng đầu tiên và xem xét ROI thống nhất (phương sai thấp) dưới ngưỡng. Sau khi xây dựng lại nền đầu tiên, có lẽ bạn có thể cải thiện bằng cách áp dụng quy trình này cho hình ảnh được chỉnh sửa phẳng.

Toàn bộ quá trình có thể được thực hiện để chạy tốt dưới một giây.


Xin chào Yves, một xử lý tự động được ưa thích. Khía cạnh DOF rất thú vị, nhưng tôi không chắc về phương pháp Otsu, vì bản thân Otsu không hoạt động tốt. Tôi có hiểu đúng không khi bạn muốn chọn các khu vực ngẫu nhiên của hình ảnh và sau đó bạn sẽ đạt ngưỡng sau giá trị trung bình trên tất cả các khu vực được chọn? Trân trọng
mchlfchr

1

Tôi nghĩ cách tốt nhất là sử dụng các đường viền Active. Nếu bạn không biết những đường viền tích cực nào hãy xem video này trên youtube http://www.youtube.com/watch?v=ijNe7f3QVdA

Về cơ bản, bạn cần đưa ra một phân đoạn khởi tạo và nó sẽ cải thiện hình dạng. Đề nghị của tôi là một trong những phương pháp được thảo luận trên bài đăng này và sử dụng các đường viền hoạt động như một bước thứ 2 tức là. như một bước cải tiến.

Dưới đây là cách triển khai các đường viền hoạt động mà bạn có thể sử dụng http://www.mathworks.com/matlabcentral/fileexchange/19567


Chào mừng bạn đến với dsp.se :) Cảm ơn bạn đã đóng góp, bạn đã cung cấp một câu trả lời hay. Nếu bạn muốn làm cho nó tốt hơn nữa, tôi nghĩ sẽ rất thú vị khi cung cấp câu trả lời cho một số câu hỏi sau: Tại sao bạn nghĩ đây là cách tiếp cận tốt nhất (ví dụ: bạn có kinh nghiệm cá nhân với tecnhique) không? Bạn nghĩ phương pháp nào đã được đề xuất sẽ kết hợp tốt với đề xuất của bạn? Đưa ra một lời giải thích ngắn về kỹ thuật, hoặc, nếu bạn có thời gian, hãy cố gắng cung cấp kết quả thử nghiệm bằng cách sử dụng kỹ thuật trên các hình ảnh ví dụ được cung cấp. Và vui chơi trên dsp!
Penelope

@mkuse, vì bạn có thể đã đọc bài viết ban đầu, tôi đã thử các đường viền hoạt động, kết hợp với giảm nhiễu và bản đồ cạnh. kết quả rất tệ và có thời gian xấu cho hình ảnh lớn.
mchlfchr

làm thế nào về bạn có một cái nhìn về các kỹ thuật giảm tiếng ồn. Bạn có thể tìm thấy một bản tóm tắt của những người ở đây: lnmiitdip.files.wordpress.com/2011/12/ mẹo
mkuse

1
@mkuse, tôi đã đề cập đến các cơ chế bạn đã đăng trong tệp PPT của bạn trong bài viết ban đầu của tôi. Tôi đã chỉnh sửa bài đăng đầu tiên của mình, để làm cho nó rõ ràng hơn, loại bộ lọc nào tôi đã sử dụng.
mchlfchr

0

Bạn biết rõ những gì bạn đang nói nhưng bạn chưa đề cập đến bằng cách sử dụng ngưỡng, cụ thể là bạn đã thử áp dụng ngưỡng toàn cầu bằng Otsu để tính toán mức độ phù hợp, sau đó tìm đường viền và chọn mức lớn nhất?

[Chỉnh sửa để làm rõ]

Ngưỡng toàn cầu rõ ràng sẽ không hoạt động do hình ảnh có thể nhìn thấy trên hình ảnh.

Tôi đã chơi nhanh với điều này và thấy rằng nếu bạn chia hình ảnh thành 6 khối (2 hàng 3 cột có kích thước bằng nhau), sau đó thực hiện sử dụng Otsu trên mỗi cái và sau đó lắp lại, thì đó là một công việc tuyệt vời trong việc dọn dẹp hình ảnh.

Vẫn còn một số đồ tạo tác nhỏ ở phần trên bên phải của ngôi sao.

Tôi nhận thấy rằng vì đối tượng có ranh giới đường thẳng, bạn có thể muốn xem xét một biến đổi Hough để trích xuất các cạnh này, cắt chúng để xác định vị trí các đỉnh và sử dụng kết quả làm đường viền đối tượng của bạn.


Xin chào Dave, tôi đã thử Otsu, nhưng nó mang lại hiệu quả là nền trên bên phải đang hợp nhất với đối tượng, điều này hoàn toàn không thể chấp nhận được.
mchlfchr

Xin chào Dave, Hough không phải là một lựa chọn, vì yêu cầu về thời gian chạy và theo như tôi biết về HT, sẽ rất tốn thời gian cho những hình ảnh lớn.
mchlfchr

0

Là các phác thảo luôn luôn là đường thẳng hoặc đường cong được biết đến?

Nếu vậy thì thay vì cố gắng để có được từng pixel dọc theo cạnh chính xác, tôi sẽ sử dụng các phép biến đổi Hough để có được phương trình của các dòng và sau đó tạo lại các đường đếm từ các đường và các hướng


1
Như tôi đã đề cập: tôi cần cách tiếp cận thời gian thực gần đó. Và theo như tôi biết về HT, nó rất tốn thời gian. Một khía cạnh khác là tôi không biết các đường cong và các đường thẳng không phải lúc nào cũng thẳng. Đường viền phụ thuộc vào vật liệu trong lò (để biết thêm thông tin, xem bài gốc của tôi).
mchlfchr

Đối với các đường thẳng, nó khá nhanh và nếu bạn biết đại khái là các đường đó ở đâu (ví dụ từ khung trước đó), bạn chỉ có thể tìm kiếm không gian paramter đó
Martin Beckett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.