2010-03-27 35 views
27

Sự cốTrong một bức ảnh kỹ thuật số, làm thế nào tôi có thể phát hiện nếu một ngọn núi bị che khuất bởi những đám mây?

Tôi có bộ sưu tập ảnh kỹ thuật số a mountain tại Nhật Bản. Tuy nhiên, ngọn núi thường bị che khuất bởi mây hoặc sương mù.

Tôi có thể sử dụng các kỹ thuật nào để phát hiện thấy ngọn núi có thể nhìn thấy trong hình ảnh? Tôi hiện đang sử dụng Perl với mô-đun Imager, nhưng mở để lựa chọn thay thế.

Tất cả các hình ảnh được lấy từ cùng một vị trí chính xác - đây là một số mẫu.

Sample Images http://www.freeimagehosting.net/uploads/7304a6e191.jpg

giải pháp ngây thơ của tôi

tôi bắt đầu bằng cách lấy một vài mẫu điểm ảnh theo chiều ngang của hình nón núi và so sánh các giá trị độ sáng để các mẫu khác từ trên trời xuống. Điều này làm việc tốt để phân biệt hình ảnh tốt 1 và hình ảnh xấu 2.

Tuy nhiên vào mùa thu tuyết rơi và núi trở nên sáng hơn bầu trời, như hình 3 và thử nghiệm độ sáng đơn giản của tôi bắt đầu thất bại.

Hình ảnh 4 là ví dụ về trường hợp cạnh. Tôi sẽ phân loại đây là một hình ảnh tốt vì một số ngọn núi có thể nhìn thấy rõ ràng.

UPDATE 1

Cảm ơn bạn đã góp ý - Tôi hạnh phúc tất cả các bạn bao la quá ước tính thẩm của tôi.

Dựa trên câu trả lời, tôi đã bắt đầu thử chuyển đổi ImageMagick edge-detect, điều này mang lại cho tôi một hình ảnh đơn giản hơn nhiều để phân tích.

convert sample.jpg -edge 1 edge.jpg 

Edge detected samples http://www.freeimagehosting.net/uploads/caa9018d84.jpg

Tôi giả sử tôi nên sử dụng một số loại mặt nạ để thoát khỏi những cái cây và hầu hết các đám mây.

Khi tôi có hình ảnh có mặt nạ, cách tốt nhất để so sánh sự giống nhau với hình ảnh 'tốt' là gì? Tôi đoán lệnh "compare" phù hợp cho công việc này? Làm thế nào để tôi nhận được giá trị 'giống nhau' bằng số này?

UPDATE 2

Tôi nghĩ rằng tôi có thể nhận được ở đâu đó với cây dây leo.

Tôi đã tạo hình ảnh 'hạt nhân' của mình (phía trên hình ảnh bên dưới) bằng cách thực hiện phát hiện cạnh trên một hình ảnh tốt. Sau đó tôi bôi đen tất cả "tiếng ồn" xung quanh đường viền của ngọn núi và sau đó cắt nó.

sau đó tôi sử dụng đoạn mã sau:

use Image::Magick; 

# Edge detect the test image 
my $test_image = Image::Magick->new; 
$test_image->Read($ARGV[0]); 
$test_image->Quantize(colorspace=>'gray'); 
$test_image->Edge(radius => 1); 

# Load the kernel 
my $kernel_image = Image::Magick->new; 
$kernel_image->Read('kernel-crop.jpg'); 

# Convolve and show the result 
$kernel_image->Convolve(coefficients => [$test_image->GetPixels()]); 
$kernel_image->Display(); 

Tôi chạy này cho hình ảnh mẫu khác nhau, và tôi đã nhận kết quả như sau (hình ảnh convolved được hiển thị bên dưới mỗi mẫu):

(Xin lỗi - hình ảnh mẫu khác nhau từ lần trước!)

alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg

Bây giờ tôi đang cố gắng để xác định số lượng như thế nào 'ridgy' một hình ảnh là. Tôi đã thử lấy độ sáng trung bình của hình ảnh:

$kernel_image->Scale('1x1'); 
die $kernel_image->GetPixel(x=>1,y=>1)[0]; 

Nhưng điều này không mang lại giá trị ý nghĩa (0,015, 0,0175 và 0,0174). Có cách nào tốt hơn không?

+4

+1 câu hỏi được trình bày rất tốt – msw

+1

Bạn đang đánh giá thấp khả năng của chính mình. Liên kết để "so sánh" trong Bản cập nhật 1 có một số phương pháp tiếp cận rất tốt để tạo ra một mức độ đo lường tương tự thông qua chập chững như Marcelo đề xuất. Tôi hy vọng bạn đang nghịch với những người như tôi gõ. – msw

Trả lời

9

Tôi nghĩ bạn đang làm việc ở mức quá thấp. Vượt qua nhanh chóng thông qua một bộ lọc phát hiện cạnh phân vùng hình ảnh thiết lập rất rõ ràng thành (1, 3) và (2, 4). Đặc biệt là nếu những hình ảnh này đến từ một quan điểm camera cố định, việc tìm kiếm một kết quả phù hợp với hình dạng nguyên mẫu trong (1) sẽ tương đối dễ dàng về mặt thuật toán. Ngay cả trường hợp của bạn (4) có thể cung cấp cho bạn một tên miền của một phần phù hợp mà bạn có thể xác định heuristically nếu có đủ núi có để xem xét.

+0

Cảm ơn bạn - Tôi đã bắt đầu chơi với phát hiện cạnh và cập nhật câu hỏi. Vẫn còn một chút khó khăn về cách định lượng có bao nhiêu ngọn núi. –

4

Câu trả lời tùy thuộc vào mức độ cụ thể của vấn đề. Nếu nó là cùng một ngọn núi từ cùng một POV, chạy và phát hiện cạnh đối với một hình ảnh tốt được biết đến, và sử dụng nó như là một đường cơ sở cho convolving chống lại hình ảnh phát hiện cạnh từ kho. Nếu nó chỉ là cạnh của ngọn núi mà bạn quan tâm, hãy xóa các đối tượng địa lý khác khỏi đường cơ sở theo cách thủ công.

+1

Cảm ơn bạn. May mắn thay vấn đề là rất cụ thể - POV là cố định. Phát hiện cạnh có vẻ là nơi thích hợp để bắt đầu. Tôi không chắc chắn về phần xoay vòng. –

+0

(Xin lỗi vì phản hồi chậm trễ; múi giờ khác nhau.) Sự chập chững của hai hình ảnh sẽ hiển thị các gai thể hiện một số loại tương tự. Nếu tất cả những gì bạn muốn biết là liệu có đủ khả năng nhìn thấy ngọn núi hay không, hãy tính toán sự liên kết giữa một hình ảnh chỉ chứa cạnh của ngọn núi và hình ảnh bạn đang thử nghiệm. Một cành mạnh gần trung tâm của hình ảnh sẽ cho biết tất cả. –

5

Một vài khuyến nghị cụ thể, xây dựng dựa trên những gì bạn đã có đã:

  1. Hãy hình ảnh tốt nhất của bạn (giống như hình ảnh 1), chạy nó thông qua phát hiện cạnh, mở kết quả trong bất kỳ trình soạn đồ họa (MS Sơn sẽ làm) và làm sạch tất cả mọi thứ ngoại trừ ranh giới trên đỉnh núi (dòng "mũ Trung Quốc"). Đây là hạt nhân của bạn. Bạn có thể cắt nó (không thay đổi kích thước!) Từ trên xuống dưới để tiết kiệm thời gian trong bước tiếp theo.
  2. Sử dụng chức năng Convolve từ PerlMagick (bạn có vẻ đã thoải mái với Perl và ImageMagick) để chuyển nhân với một vài hình ảnh. Trên hình ảnh kết quả, bạn sẽ thấy một cành nhọn tương ứng với vị trí "chính xác" của hạt nhân (trùng với ngọn núi trong hình ảnh).
  3. Độ cao tương đối (với mức độ ồn xung quanh) của đỉnh này sẽ lớn hơn khi ngọn núi nhìn rõ hơn. Bằng cách chụp một số hình ảnh đại diện, bạn có thể xác định ngưỡng sẽ tách hình ảnh đẹp khỏi những hình ảnh xấu.
  4. Bất kể bạn làm gì, sẽ có dương tính giả và âm tính giả. Được chuẩn bị.
+0

Cảm ơn bạn đã hướng dẫn từng bước. Điều này thực sự hữu ích cho cấp độ của tôi. Tuy nhiên tôi là một chút không chắc chắn như thế nào bước 2 hoạt động - làm thế nào để vượt qua hình ảnh 'hạt nhân' để chức năng Convolve - nó có vẻ chỉ mất một ma trận của hệ số? –

+0

@Gavin: Hạt nhân == ma trận.Tôi đã cố gắng tìm một số giải thích phù hợp về các cuộc cách mạng trực tuyến cho bạn, nhưng không thể tìm thấy bất cứ điều gì - có thể bạn nên thử bản thân. – AVB

+0

Sau nhiều lần hack, tôi đã sử dụng $ test_image-> GetPixels() làm hệ số - có hợp lệ không? Tôi đã cập nhật bài đăng một lần nữa. –

Các vấn đề liên quan