2009-10-20 37 views
5

Làm thế nào để đọc một hình ảnh trong C để tôi có thể kiểm soát trực tiếp các pixel của nó (như chúng ta làm trong MATLAB)?Làm thế nào để thao tác một hình ảnh ở cấp độ pixel trong C?

tôi đã cố gắng theo cách cũ:

FILE *fp; 
fp = fopen("C:\\a.tif","r"); 

mà chỉ mang lại cho tôi những hình thức ascii của tập tin hình ảnh (tôi nghĩ).

Làm cách nào để kiểm soát mức pixel đối với hình ảnh và thực hiện một số thao tác cơ bản như nói, đảo ngược hình ảnh?

+1

C có mức độ thấp hơn một chút so với mức bạn nghĩ. Đó là fopen là cho bạn nhị phân nguyên, và nó vào bạn hoặc tìm ra cách để giải thích rằng nhị phân như là một hình ảnh, hoặc sử dụng một thư viện như đề nghị dưới đây. – Breton

+0

@Breton, ông đặc biệt hỏi làm thế nào để giải mã các tập tin, không phải là nội dung nhị phân. Tôi cảm thấy rằng C là một lựa chọn tốt hơn khi bạn muốn chương trình của bạn được nhanh chóng, Python khác cung cấp PIL là đủ tốt. – Xolve

+1

@Breton - Đó là 'fopen()' cho bạn không có nhị phân thô như vậy, nó cho bạn chế độ văn bản, có nghĩa là nó có khả năng đọc một số tệp không chính xác trên Windows. –

Trả lời

2

OpenCV là thư viện computer vision, nhưng có thể được sử dụng cho các nhiệm vụ "cấp thấp" quá. Nó hỗ trợ BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF, TIF.

3

Hãy xem libtiff. Gần như tất cả các định dạng hình ảnh đều có một số loại dữ liệu tiêu đề và nhiều định dạng được nén để giữ cho các tệp được hợp lý hóa. Tất nhiên bạn có thể viết mã C để đọc các tiêu đề và thực hiện giải nén, nhưng không cần thiết vì ai đó đã thực hiện nó. Hãy xem here đối với một số thư viện hình ảnh C.

Câu hỏi khác là hình thức bạn muốn dữ liệu để thao tác - một lựa chọn chung là RGB 24 bit (tức là R, G và B mỗi biến đổi từ 0 đến 255). Trong MATLAB bạn cũng thấy R, G, B là tăng gấp đôi thay đổi từ 0,0 đến 1,0. Hoặc bạn có thể muốn một không gian màu khác (HSV, YUV, v.v.).

Hãy nhớ rằng các hoạt động số nguyên nhanh hơn, nhưng chúng có thể rắc rối hơn.

+0

+1 để trả lời câu hỏi của OP nhưng cũng nhắc họ không sáng tạo lại bánh xe – JeffH

3

Để thao tác jpeg file sử dụng libjpeg, các tiff file sử dụng libtiff vv

Một tùy chọn dễ dàng là gd cho phép thao tác của nhiều định dạng hình ảnh (PNG, JPEG, GIF, ...) .

1

Có một số lib nguồn mở để tải hình ảnh của các loại khác nhau và libtiff để tải hình ảnh tiff. Nếu bạn chỉ muốn chơi xung quanh và định dạng tập tin không phải là rất quan trọng, sau đó tôi sẽ có một cái nhìn về định dạng netpbm (inparticular P5 và P6). Nó là khá dễ dàng để viết một bộ nạp và tiết kiệm cho nó và tất nhiên là một bài tập tốt.

1

MagickWand từ ImageMagick là một lựa chọn tốt

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