2009-10-08 34 views
5

Tôi muốn đọc các giá trị RGB cho từng pixel từ một hình ảnh thô. Ai đó có thể cho tôi biết làm thế nào để đạt được điều này? Cảm ơn vì sự giúp đỡ!Nhận các giá trị RGB cho mỗi pixel từ một hình ảnh thô trong C

định dạng của hình ảnh thô của tôi là .CR2 đến từ máy ảnh.

+2

Bạn cần chỉ định cách hiển thị "hình ảnh thô" và định dạng đó là gì. – sharptooth

+2

Xác định "hình ảnh thô". Đây có phải là tệp hình ảnh không? Nếu vậy, loại tập tin nào? Hay bạn đang cố chụp ảnh màn hình?Chỉnh sửa câu hỏi của bạn để thêm chi tiết. – Artelius

+1

Định dạng "thô" của bạn là định dạng nào. Nó có phải là một bitmap hoặc một tập tin hình ảnh lấy từ một máy ảnh có lẽ? – ChrisBD

Trả lời

1

Hình ảnh RAW là định dạng không nén, vì vậy bạn chỉ cần trỏ pixel của mình ở đâu (bỏ qua bất kỳ tiêu đề có thể nào và sau đó thêm kích thước pixel lần các cột số lần số hàng cộng với số của colum), và sau đó đọc bất kỳ dữ liệu nhị phân nào đang đưa ra một định dạng có ý nghĩa cho bố cục của dữ liệu (với mặt nạ và ca, bạn biết).

Đó là quy trình chung, đối với định dạng hiện tại của bạn, bạn sẽ phải kiểm tra chi tiết.

4

Giả sử hình ảnh là w * h pixel và được lưu trữ ở đúng định dạng RGB "đóng gói" không có thành phần alpha, mỗi pixel sẽ yêu cầu ba byte.

Trong ký ức, dòng đầu tiên của hình ảnh có thể được trình bày trong đồ họa ASCII tuyệt vời như thế này:

R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1) 

Ở đây, mỗi R n G n và B n đại diện cho một byte đơn , cho thành phần màu đỏ, xanh lục hoặc xanh lam của pixel n của đường quét đó. Lưu ý rằng thứ tự của các byte có thể khác nhau đối với các định dạng "thô" khác nhau; không có tiêu chuẩn thế giới được thỏa thuận. Môi trường khác nhau (card đồ họa, máy ảnh, ...) làm điều đó khác nhau vì bất kỳ lý do gì, bạn chỉ cần biết bố cục.

Reading ra một điểm ảnh sau đó có thể được thực hiện bằng chức năng này:

typedef unsigned char byte; 
void get_pixel(const byte *image, unsigned int w, 
       unsigned int x, 
       unsigned int y, 
       byte *red, byte *green, byte *blue) 
{ 
    /* Compute pointer to first (red) byte of the desired pixel. */ 
    const byte * pixel = image + w * y * 3 + 3 * x; 
    /* Copy R, G and B to outputs. */ 
    *red = pixel[0]; 
    *green = pixel[1]; 
    *blue = pixel[2]; 
} 

Chú ý cách chiều cao của hình ảnh là không cần thiết để làm việc này, và làm thế nào các chức năng thoát khỏi giới hạn kiểm tra. Một chức năng chất lượng sản xuất có thể được mạ giáp hơn.

Cập nhật Nếu bạn đang lo lắng phương pháp này sẽ là quá chậm, bạn có thể tất nhiên chỉ vòng qua các điểm ảnh, thay vì:

unsigned int x, y; 
const byte *pixel = /* ... assumed to be pointing at the data as per above */ 

for(y = 0; y < h; ++y) 
{ 
    for(x = 0; x < w; ++x, pixel += 3) 
    { 
    const byte red = pixel[0], green = pixel[1], blue = pixel[2]; 

    /* Do something with the current pixel. */ 
    } 
} 
+0

Nếu anh ta chỉ cần truy vấn 1 pixel, chức năng của bạn là tốt. Tuy nhiên, nếu anh ta cần xử lý tất cả các pixel, chức năng này không phải là cách để đi vì nó quá chậm (chức năng trên không + 3 phép nhân cho mỗi pixel) – Toad

+0

@reinier: Điều đó có thể đúng, giả sử không có nội tuyến. Tôi cũng đã thêm một đoạn mã lồng nhau để hiển thị điều đó. Cảm ơn. – unwind

+0

@unwind Tôi có tệp jpg, tôi đã sử dụng ngưỡng tưởng tượng và ngưỡng áp dụng, đồng thời thay đổi tất cả các pixel trên giá trị ngưỡng như màu đen và màu trắng khác. Bây giờ, tôi muốn kiểm tra từng pixel, nếu nó có màu đen hoặc trắng. Phương thức trên có hoạt động không. Giá trị cho đỏ, xanh lá cây và xanh dương là gì? 255? – Kraken

5

Không ai trong số các phương pháp gửi cho đến nay có nhiều khả năng để làm việc với một tệp "thô" của máy ảnh. Định dạng tệp cho các tệp thô là độc quyền cho mỗi nhà sản xuất và có thể chứa dữ liệu phơi nhiễm, hằng số hiệu chuẩn và thông tin cân bằng trắng, ngoài dữ liệu pixel, có khả năng ở định dạng đóng gói trong đó mỗi puxel chiếm nhiều hơn một byte , nhưng ít hơn hai.

Tôi chắc chắn rằng có các chương trình chuyển đổi tệp nguyên liệu nguồn mở ra khỏi đó mà bạn có thể tham khảo để tìm hiểu các thuật toán sử dụng, nhưng tôi không biết bất kỳ điều gì ngoài đầu của tôi.


chỉ cần nghĩ đến một biến chứng khác. Tệp thô không lưu trữ các giá trị RGB cho mỗi pixel. Mỗi pixel chỉ ghi lại một màu. Hai màu khác phải được nội suy từ các pixel lân cận. Bạn chắc chắn sẽ tốt hơn khi tìm một chương trình hoặc thư viện hoạt động với máy ảnh của bạn.

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