2009-05-05 33 views
6

Đây là một câu hỏi khá rộng; những công cụ/thư viện nào tồn tại để chụp hai bức ảnh không giống nhau, nhưng cực kỳ giống nhau và xác định sự khác biệt cụ thể giữa chúng?Xác định sự khác biệt giữa hai ảnh gần giống hệt nhau

Một ví dụ là chụp ảnh chiếc ghế của tôi vào thứ Sáu sau khi bạn gái của tôi được dọn dẹp và trước một ngày cuối tuần dài kết bạn, uống rượu và chơi nhạc rock. Hai ngày sau, tôi chụp một bức ảnh thứ hai của chiếc ghế dài; ánh sáng giống hệt nhau, chiếc ghế dài đã không di chuyển một milimét, và tôi sử dụng một chân máy ở một vị trí cố định.

Tôi có thể sử dụng công cụ nào để tạo ra sự khác biệt về hình ảnh hoặc hình ảnh bản đồ nhiệt thứ ba về sự khác biệt? Có bất kỳ công cụ nào cho .NET không?

Trả lời

1

Kiểm tra Andrew Kirillov's article trên CodeProject. Ông đã viết một ứng dụng C# bằng cách sử dụng thư viện thị giác máy tính AForge.NET để phát hiện chuyển động. Trên trang web AForge.NET, có discussion của hai khung hình khác biệt cho phát hiện chuyển động.

5

Điều này phụ thuộc phần lớn vào định dạng và nén hình ảnh. Nhưng, vào cuối ngày, bạn có thể lấy hai raster và so sánh chúng bằng pixel.

Hãy xem Perceptual Image Difference Utility.

+0

Cảm ơn bạn đã liên kết, tôi chắc chắn sẽ chơi với điều đó để xem đó có phải là điểm xuất phát tốt cho những gì tôi đang làm hay không. – STW

1

Đó là một câu hỏi thú vị. Tôi không thể giới thiệu bạn đến bất kỳ thư viện cụ thể nào, nhưng quá trình bạn hỏi về cơ bản là trường hợp tối thiểu của việc đền bù chuyển động. Đây là cách mà MPEG (MP4, DIVX, bất cứ điều gì) video quản lý để nén video rất tốt; bạn có thể xem xét một số thông tin về cách thức các thuật toán bù trừ chuyển động được thực hiện.

Một điều khác cần lưu ý; Nén JPEG là nén dựa trên khối; nhiều lợi ích mà MPEG mang lại từ mọi thứ là thực sự thực hiện so sánh khối. Nếu hầu hết hình ảnh của bạn (nói nền) giống nhau từ một hình ảnh đến hình ảnh tiếp theo, các khối đó sẽ không thay đổi. Đó là một cách nhanh chóng để giảm lượng dữ liệu cần thiết để so sánh.

+0

Đó là điều tôi chưa bao giờ xem xét, nhưng một điểm tuyệt vời – STW

+0

Bạn thậm chí có thể tập hợp một clip ngắn từ một bản sao của hình ảnh trước đó và sao chép hình ảnh sau. Nén với MPEG, và phân tích kết quả .... ;-) – RBerteig

2

Cách rõ ràng nhất để thấy mọi sự khác biệt nhỏ, thường không thể nhận thấy, sẽ là XOR dữ liệu pixel. Nếu ánh sáng thậm chí hơi khác nhau, mặc dù, nó có thể là quá nhiều. Sự khác biệt (trừ đi) dữ liệu pixel có thể là nhiều hơn những gì bạn đang tìm kiếm, tùy thuộc vào sự khác biệt tinh tế.

+0

Tôi chắc chắn sẽ phải chơi với điều đó; Nó có thể là một trong số ít phương pháp mà tôi có thể phát triển từ đầu trong phạm vi kỹ năng của tôi – STW

+1

Nếu bạn muốn xem một số phương pháp này hoạt động trước khi tự viết mã, hãy xem bất kỳ chế độ thành phần lớp của trình soạn thảo đồ họa lớp raster nào. Paint.NET là những cái tôi đang nghĩ đến, nhưng đó là một op pixel nhị phân cơ bản, vì vậy tất cả các triển khai phải giống nhau. – bsneeze

2

Một nơi để bắt đầu là có thư viện xử lý hình ảnh phong phú như IM. Bạn có thể dabble với các nhà khai thác của nó tương tác với các công cụ IMlab, gọi nó trực tiếp từ C hoặc C + +, hoặc sử dụng thực sự phong nha của nó Lua ràng buộc để lái nó từ Lua. Nó hỗ trợ một loạt các hoạt động trên bitmap, cũng như một thư viện mở rộng các định dạng tệp.

Thậm chí nếu bạn không cố ý di chuyển bất cứ điều gì, bạn có thể muốn sử dụng một thuật toán như SIFT để có được sự liên kết chất lượng pixel phụ tốt giữa các khung. Trừ khi bạn muốn để xử lý máy ảnh như cố định và phát hiện chuyển động của chiếc ghế dài.

+0

Đó là cả hai chính xác là câu trả lời tôi đã được cả hai dreading và hy vọng; Tôi không phải là một nhà phát triển C hoặc C++ hoặc Lua - nhưng điều này trông giống như một dự án thú vị để có được bàn chân của tôi/thân/đầu/ống thở ướt với. Tôi có lẽ sẽ ở trên đầu của tôi nhưng tôi cho rằng đó là lý do tại sao tôi đã đề cập đến ống thở – STW

+1

Nếu bạn đi sâu vào, bạn sẽ muốn xem các thư viện đồng hành của nó là CD và IUP. CD cung cấp một khung chung để vẽ trên bitmap (hoặc màn hình) và IUP cung cấp một khung giao diện người dùng di động. Các liên kết có tại trang IMLab. Có rất nhiều sự giúp đỡ của Lua tại www.lua.org thông qua danh sách gửi thư chính thức, và người dùng sử dụng wiki, hoặc ở đây được gắn thẻ "lua" để phục vụ như ống thở oh-so-vital khi bạn cần. ;-) – RBerteig

0

chỉ cần sử dụng.các lớp hình ảnh net, tạo bitmap mới() x 2 và xem giá trị B & G & B của mỗi pixel, bạn cũng có thể xem xét giá trị A (Alpha/độ trong suốt) nếu bạn muốn khi xác định sự khác biệt.

cũng là một lưu ý, bằng cách sử dụng phương thức getPixel (y, x) có thể rất chậm, có một cách khác để có được toàn bộ hình ảnh (ít thanh lịch hơn) và cho mỗi lần tự xuyên qua nó nếu tôi nhớ nó được gọi là getBitmap hoặc một cái gì đó tương tự, nhìn vào các lớp hình ảnh/bitmap & đọc một số tutes họ thực sự là tất cả các bạn cần & không phải là khó sử dụng, không đi bên thứ ba trừ khi bạn phải.

+0

ps: gửi email cho tôi nếu bạn cần thêm tài nguyên/trợ giúp về điều này, tôi đã dành 2 năm trong cuộc đời của tôi với lớp này một lúc trở lại :) –

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