| # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| |
| from PIL import Image |
| from PIL import ImageChops |
| |
| from autotest_lib.client.cros.video import method_logger |
| |
| |
| class RGBImageComparer(object): |
| """ |
| Compares two RGB images using built-in python image library |
| |
| """ |
| |
| def __enter__(self): |
| return self |
| |
| |
| @method_logger.log |
| def compare(self, golden_image_path, test_image_path): |
| """ |
| Compares a test image against a known golden image. |
| |
| Both images must be RGB images. |
| |
| @param golden_image_path: path, complete path to a golden image. |
| @param test_image_path: path, complete path to a test image. |
| |
| @throws: ValueError if either image is not an RGB |
| |
| @return: int, number of pixels that are different. |
| |
| """ |
| golden_image = Image.open(golden_image_path) |
| test_image = Image.open(test_image_path) |
| |
| if golden_image.mode != 'RGB' or test_image.mode != 'RGB': |
| logging.debug("Golden image mode is %s", golden_image.mode) |
| logging.debug("Test image mode is %s", test_image.mode) |
| raise ValueError("Expected both images to be RGB. Bailing out.") |
| |
| diff_image = ImageChops.difference(golden_image, test_image) |
| |
| """ |
| If the two images are the same, the diff will be pure black. Diff image |
| is also an RGB image whose histogram is a concatenated list of |
| R histogram, G histogram and B histogram |
| Full histogram will be a list with 256 * 3 = 768 elements |
| h[0] contains all R pixels whose value is 0 |
| h[256] contains all G pixels whose value is 0 |
| h[512] contains all B pixels whose value is 0 |
| We must remove these values from the total count to find out the |
| number of non black pixels in the diff image |
| |
| """ |
| |
| hist = diff_image.histogram() |
| |
| logging.debug("Color counts") |
| logging.debug(diff_image.getcolors()) |
| differing_pixels = sum(hist) - hist[0] - hist[256] - hist[512] |
| |
| return differing_pixels |
| |
| |
| def __exit__(self, exc_type, exc_val, exc_tb): |
| pass |