2016-03-10 15 views
5

Tôi có ứng dụng Android, nơi người dùng chụp ảnh của chính anh ấy bằng camera trước và sau đó ảnh đang được tải lên máy chủ của tôi. Tôi nhận thấy rằng nhiều hình ảnh đến máy chủ của tôi quá tối (đôi khi gần như không thể rõ ràng nhìn thấy khuôn mặt người dùng).Cách phát hiện ảnh tối trong Android

Tôi muốn lọc các ảnh đó và hiển thị thông báo (ví dụ: "Ảnh quá tối. Chụp thêm một ảnh") cho người dùng ở phía ứng dụng. Làm thế nào tôi có thể hoàn thành nhiệm vụ như vậy trong Android?

EDIT:

tôi đã tìm ra cách để tính toán độ sáng cho một pixel (cảm ơn đối với câu trả lời này: https://stackoverflow.com/a/16313099/2999943):

private boolean isPixelColorBright(int color) { 
    if (android.R.color.transparent == color) 
     return true; 

    boolean rtnValue = false; 

    int[] rgb = {Color.red(color), Color.green(color), Color.blue(color)}; 

    int brightness = (int) Math.sqrt(rgb[0] * rgb[0] * .299 + rgb[1] 
      * rgb[1] * .587 + rgb[2] * rgb[2] * .114); 

    if (brightness >= 200) { // light color 
     rtnValue = true; 
    } 

    return rtnValue; 
} 

Nhưng tôi vẫn không có ý tưởng rõ ràng như thế nào để xác định toàn bộ độ sáng của hình ảnh "trạng thái". Bất kỳ đề xuất?

+0

Nếu bạn có thể xác định độ sáng cho một điểm ảnh singe, tại sao không phân tích tất cả các pixel trong cùng một cách để có được giá trị trung bình, và sử dụng? – JonasCz

Trả lời

7

Là một biến thể, bạn có thể tạo biểu đồ độ sáng cho ảnh của mình. Tính độ sáng như mô tả ở đây Formula to determine brightness of RGB color. Sau đó khởi tạo mảng có kích thước 256 và tăng thêm bởi một phần tử mảng mà chỉ mục là độ sáng của mỗi pixel.

Sau đó, xem có quá nhiều giá trị ở bên trái hay bên phải, điều đó có nghĩa là ảnh của bạn quá sáng/tối. Ví dụ bạn có thể xem 10 giá trị bên phải và bên trái.

Mã dụ:

int histogram[256]; 
for (int i=0;i<256;i++) { 
    histogram[i] = 0; 
} 

for (int x = 0; x < a.getWidth(); x++) { 
    for(int y = 0; y < a.getHeight(); y++) { 
     int color = a.getRGB(x, y); 

     int r = Color.red(pixel); 
     int g = Color.green(pixel); 
     int b = Color.blue(pixel); 

     int brightness = (int) (0.2126*r + 0.7152*g + 0.0722*b); 
     histogram[brightness]++; 
    } 
} 

int allPixelsCount = a.getWidth() * a.getHeight(); 

// Count pixels with brightness less then 10 
int darkPixelCount = 0; 
for (int i=0;i<10;i++) { 
    darkPixelCount += histogram[i]; 
} 

if (darkPixelCount > allPixelCount * 0.25) // Dark picture. Play with a percentage 
else // Light picture. 
+0

Cảm ơn câu trả lời. Tôi có thể tính toán mức độ brigtness cho một pixel duy nhất (xem câu hỏi đã chỉnh sửa của tôi) theo thông tin bạn cung cấp. Nhưng bạn có thể giải thích thêm các bước chi tiết hơn không? Làm thế nào chính xác tôi có thể xây dựng biểu đồ độ sáng hình ảnh? Ngoài ra tôi không nhận được đầy đủ câu này: "Sau đó khởi tạo mảng kích thước 256 và tăng thêm một phần tử mảng mà chỉ mục là độ sáng của mỗi pixel". Bạn có thể minh họa ý tưởng của mình bằng đoạn mã ngắn không? – user2999943

+0

Đã thêm ví dụ về mã. Hỏi tôi xem có điều gì không rõ ràng không. –

+0

Bây giờ tôi đã hiểu. Cảm ơn! – user2999943

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