2008-09-27 46 views
5

Tôi muốn thực hiện một số công việc với các hình ảnh của máy tính. Tôi đang tìm cách đọc các pixel đơn lẻ của dữ liệu, phân tích chúng theo lập trình và thay đổi chúng. Ngôn ngữ tốt nhất để sử dụng cho điều này (Python, C++, Java ...) là gì? Fileformat tốt nhất là gì?Nhận dạng hình ảnh

Tôi không muốn có bất kỳ phần mềm/API siêu lạ mắt nào ... Tôi đang tìm kiếm các khái niệm cơ bản về căn bản.

Trả lời

7

Nếu bạn cần tốc độ (có thể bạn sẽ luôn muốn tốc độ xử lý hình ảnh), bạn chắc chắn phải làm việc với dữ liệu pixel thô. Java có một số nhược điểm thực sự khi bạn không thể truy cập bộ nhớ trực tiếp khiến cho truy cập pixel chậm hơn so với truy cập bộ nhớ trực tiếp. C++ chắc chắn là ngôn ngữ được lựa chọn để sản xuất sử dụng xử lý hình ảnh. Nhưng bạn có thể, ví dụ, cũng sử dụng C# vì nó cho phép mã không an toàn trong các khu vực cụ thể. (Hãy xem đặc tính con trỏ scan0 của lớp bitmapdata.) Tôi đã sử dụng C# thành công cho các ứng dụng xử lý hình ảnh và chúng chắc chắn nhanh hơn nhiều so với các đối tác java của chúng. Tôi sẽ không sử dụng bất kỳ ngôn ngữ kịch bản hoặc java nào cho một mục đích như vậy.

0

Câu trả lời ngắn? Tôi muốn nói C++, bạn có linh hoạt hơn nhiều trong việc thao tác các khối dữ liệu thô hơn Python hoặc Java.

2

Không chỉ C/C++ nhanh hơn, mà hầu hết mã mẫu xử lý hình ảnh bạn tìm thấy sẽ có trong C, vì vậy sẽ dễ dàng kết hợp những thứ bạn tìm thấy.

1

(Điều này có thể không áp dụng cho các OP người chỉ muốn những điều cơ bản để trần -. Nhưng bây giờ mà các vấn đề tốc độ lớn lên, tôi cần phải viết những dòng này, chỉ cần cho các hồ sơ)

Nếu bạn thực sự cần tốc độ, tốt hơn là bạn nên quên làm việc ở cấp pixel-by-pixel và xem liệu các hoạt động bạn cần thực hiện có thể là vectorized hay không. Ví dụ, đối với mã C/C++ của bạn, bạn có thể sử dụng tuyệt vời Intel IPP library (không, tôi không làm việc cho Intel).

1

nếu bạn đang tìm kiếm công việc số trên hình ảnh của bạn (suy nghĩ ma trận) và bạn vào Python kiểm tra http://www.scipy.org/PyLab - đây là cơ bản khả năng làm matlab trong python, buddy của tôi swears bởi nó.

4

Rất đông để thao tác các mảng thông tin pixel đa chiều hoặc phức tạp lớn là hình ảnh sử dụng các ngôn ngữ cấp cao như Python. Có một thư viện gọi là PIL (the Python Imaging Library) khá hữu ích và sẽ cho phép bạn thực hiện các bộ lọc và biến đổi chung (thay đổi độ sáng, làm mềm, desaturate, cắt, vv) cũng như thao tác với dữ liệu pixel thô.

Thư viện hình ảnh easiest and simplest Tôi đã sử dụng cho đến nay và có thể được gia hạn để làm bất cứ điều gì bạn quan tâm (ví dụ: edge detection trong mã rất ít).

1

Nó phụ thuộc một chút vào những gì bạn đang cố gắng làm.

Nếu tốc độ thời gian chạy là vấn đề của bạn thì C++ là cách tốt nhất để thực hiện.

Nếu tốc độ phát triển là một vấn đề, tuy nhiên, tôi khuyên bạn nên xem xét java. Bạn nói rằng bạn muốn thao tác ở mức độ thấp của pixel, mà java sẽ làm cho bạn. Nhưng điều khác có thể là một vấn đề là việc xử lý các định dạng tệp khác nhau. Java không có một số API rất tốt đẹp để đối phó với việc đọc và viết các định dạng hình ảnh khác nhau để tập tin (đặc biệt là thư viện java2d.Bạn chọn bỏ qua các cấp cao hơn của API)

Nếu bạn thực hiện tùy chọn C++ (hoặc python nghĩ về nó), tôi sẽ đề xuất sử dụng thư viện để giúp bạn vượt qua các vấn đề về đọc sách và viết các tập tin. Trước đây tôi đã thành công với libgd

1

Ngôn ngữ nào bạn biết là tốt nhất? Với tôi, đây là câu hỏi thực sự. Nếu bạn định dành hàng tháng và tháng để học một ngôn ngữ cụ thể, thì không có lợi thế thực sự khi sử dụng Python hay Java chỉ cho tốc độ phát triển (được chứng minh) của họ. Tôi đặc biệt thành thạo trong C++ và tôi nghĩ rằng đối với công việc cụ thể này, tôi có thể nhanh như một lập trình viên Java, chẳng hạn. Với sự trợ giúp của một số thư viện tốt (OpenCV xuất hiện trong tâm trí), bạn có thể tạo ra bất cứ thứ gì bạn cần trong một vài dòng mã C++.

1

Câu trả lời ngắn: C++ và OpenCV

1

tôi đã nghiên cứu trí tuệ nhân tạo và Computer Vision, vì vậy tôi biết khá tốt các loại công cụ được sử dụng trong lĩnh vực này.

Về cơ bản: bạn có thể sử dụng bất kỳ thứ gì bạn muốn miễn là bạn biết cách hoạt động của cảnh đó.

Bây giờ tùy thuộc vào những gì bạn muốn đạt được, bạn có thể sử dụng:

  • ngôn ngữ C, nhưng bạn sẽ mất rất nhiều thời gian trong lỗi kiểm tra và quản lý bộ nhớ khi thực hiện các thuật toán của bạn. Về mặt lý thuyết, đây là ngôn ngữ nhanh nhất để thực hiện loại công việc đó, nhưng nếu thuật toán của bạn không hiệu quả về mặt tính toán (về độ phức tạp) hoặc nếu bạn mất quá nhiều thời gian để kiểm tra lỗi thì điều này rõ ràng là không đáng. Vì vậy, tôi khuyên bạn nên triển khai ứng dụng của mình trước tiên bằng một ngôn ngữ khác, và sau đó bạn luôn có thể tối ưu hóa các phần nhỏ của mã của bạn với các ràng buộc C.
  • Octave/MatLab: ngôn ngữ rất hiệu quả, gần bằng C, và bạn có thể thực hiện các thuật toán rất thanh lịch và súc tích. Nếu bạn đang vào các hoạt động vector, ma trận và tuyến tính, bạn nên đi với điều đó. Tuy nhiên, bạn sẽ không thể phát triển toàn bộ ứng dụng bằng ngôn ngữ này, nó tập trung nhiều hơn vào thuật toán, nhưng sau đó bạn luôn có thể phát triển giao diện bằng ngôn ngữ khác sau này.
  • Python: tất cả-trong-một ngôn ngữ thanh lịch và dễ tiếp cận, được sử dụng trong các ứng dụng quy mô lớn như Google và Facebook. Bạn có thể làm khá nhiều thứ bạn muốn với Python, bất kỳ loại ứng dụng nào. Nó sẽ được điều chỉnh hoàn toàn nếu bạn muốn tạo một ứng dụng đầy đủ (với sự tương tác của khách hàng và tất cả, không chỉ các thuật toán), hoặc nếu bạn muốn nhanh chóng phác thảo một mẫu thử bằng cách sử dụng các thư viện hiện có vì Python có rất nhiều thư viện chất lượng cao, như OpenCV. Tuy nhiên, nếu bạn chỉ muốn tạo các thuật toán, bạn nên sử dụng Octave/MatLab tốt hơn.

Câu trả lời được chọn là giải pháp được gắn nhãn, và bạn nên cẩn thận về loại nhận xét cổ xưa này.

Ngày nay, phần cứng rẻ hơn wetware (con người), và do đó, bạn nên sử dụng ngôn ngữ nơi bạn có thể tạo kết quả nhanh hơn, ngay cả khi chi phí của một vài chu kỳ CPU hoặc dung lượng bộ nhớ.

Ngoài ra, rất nhiều người có xu hướng nghĩ rằng miễn là bạn triển khai phần mềm của mình trong C/C++, bạn đang làm cho Graal of Gravity of speedness: điều này không đúng.Thứ nhất, vì thuật toán phức tạp hơn rất nhiều so với ngôn ngữ bạn sử dụng (thuật toán xấu sẽ không bao giờ đánh bại thuật toán tốt hơn, ngay cả khi được thực hiện bằng ngôn ngữ chậm nhất trong vũ trụ) và thứ hai là vì ngôn ngữ cấp cao hiện đang làm rất nhiều của bộ nhớ đệm và tối ưu hóa tốc độ cho bạn, và điều này có thể làm cho chương trình của bạn chạy nhanh hơn trong C/C++.

Tất nhiên, bạn luôn có thể làm mọi thứ ở trên trong C/C++, nhưng bạn sẵn sàng lãng phí bao nhiêu thời gian để tái tạo lại bánh xe?

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