2016-06-02 21 views
5

Hiện tại tôi có một hình ảnh mà từ đó tôi đang lấy màu nền. Tôi đang làm cho màu nền trong suốt, sau đó cố gắng so sánh nó với hình ảnh ban đầu để xác định phần trăm của hình ảnh bao gồm màu nền đã cho biết. Đây là mã tôi đang cố gắng sử dụng:Tỷ lệ phần trăm pixel đã thay đổi trong một hình ảnh trong PHP

$image = new Imagick($file); 

// Make bg transparent for comparison 
$tpImage = $image->clone(); 
$tpImage->setFormat('png'); 
$tpImage->setImagePage(0, 0, 0, 0); 

$swatch_pixel = $tpImage->getImagePixelColor(1, 1); 

$tpImage->paintTransparentImage($swatch_pixel, 0, 65535 * 0.1); 

$image->SetOption('fuzz', '2%'); 
$result = $image->compareImages($tpImage, Imagick::METRIC_ABSOLUTEERRORMETRIC); 

echo $result[0]; 

Hiện tại luôn luôn trả về 0 ... Tôi không chắc mình có cần sử dụng phương pháp so sánh khác hay gì không, hoặc nếu tôi đang làm gì khác sai, tôi đã dành khá nhiều thời gian cho việc này và hầu hết các tài nguyên tôi tìm thấy khá cũ.

+1

Hãy thử sử dụng '$ image-> identFor mat ("% [biến dạng]") 'để chọn chỉ số sau khi chạy' $ image-> compareImages() ' –

+0

Câu trả lời của tôi dưới đây có phân loại vấn đề của bạn không? Nếu vậy, xin vui lòng xem xét chấp nhận nó như là câu trả lời của bạn - bằng cách nhấp vào dấu tick/dấu kiểm màu xanh lá cây bên cạnh số phiếu bầu. Nếu không, vui lòng nói những gì không hiệu quả để tôi hoặc người khác có thể hỗ trợ thêm cho bạn. Cảm ơn. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

Trả lời

1

Cập nhật trả lời

Trên thực tế, bây giờ mà bạn trỏ nó ra một cách rõ ràng, số liệu ABSOLUTE_ERROR sẽ không hoạt động khi sự khác biệt duy nhất là sự minh bạch.

Để giải đáp câu hỏi của bạn, có lẽ bạn chỉ muốn tách ra kênh alpha sử dụng:

separateImageChannel(Imagick::CHANNEL_ALPHA); 

và rồi lấy trung bình thống kê của nó mà sẽ cho bạn biết bao nhiêu phần trăm của các điểm ảnh màu trắng - nghĩa minh bạch.

Tôi sẽ để lại câu trả lời ban đầu dưới đây, bởi vì nó là một kỹ thuật hữu ích sẽ làm việc cho bất kỳ sự khác biệt hình ảnh nào khác không hoàn toàn về tính minh bạch.

gốc trả lời

Bạn có thể nhận được các thuộc tính hình ảnh sau khi so sánh và tìm ra nguyên tố gọi là "bóp méo" trong đó. Vì vậy, nếu tôi bắt đầu với hình ảnh này:

enter image description here

và sau đó cuộn nó đúng 10 pixels:

enter image description here

<?php 
    $image1 = new Imagick("image.png"); 
    $image2 = new Imagick("image.png"); 

    $result = $image1->compareImages($image2,Imagick::METRIC_MEANABSOLUTEERROR); 
    $p1=$image1->getImageProperties(); 
    print_r($p1); 
    $image1->rollImage(10,0); 
    $result = $image1->compareImages($image2,Imagick::METRIC_MEANABSOLUTEERROR); 
    $p1=$image1->getImageProperties(); 
    print_r($p1); 
?> 

Output

Array 
(
    [date:create] => 2016-06-02T14:15:01+01:00 
    [date:modify] => 2016-06-02T14:15:01+01:00 
    [distortion] => 0       <--- Here's the little devil 
    [png:bKGD] => chunk was found (see Background color, above) 
    [png:cHRM] => chunk was found (see Chromaticity, above) 
    [png:gAMA] => gamma=0.45454544 (See Gamma, above) 
    [png:IHDR.bit-depth-orig] => 4 
    [png:IHDR.bit_depth] => 4 
    [png:IHDR.color-type-orig] => 3 
    [png:IHDR.color_type] => 3 (Indexed) 
    [png:IHDR.interlace_method] => 0 (Not interlaced) 
    [png:IHDR.width,height] => 200, 200 
    [png:PLTE.number_colors] => 5 
    [png:sRGB] => intent=0 (Perceptual Intent) 
    [png:text] => 2 tEXt/zTXt/iTXt chunks were found 
    [png:tIME] => 2016-06-02T14:15:01Z 
) 
Array 
(
    [date:create] => 2016-06-02T14:15:01+01:00 
    [date:modify] => 2016-06-02T14:15:01+01:00 
    [distortion] => 0.0833333      <--- Here's the little devil 
    [png:bKGD] => chunk was found (see Background color, above) 
    [png:cHRM] => chunk was found (see Chromaticity, above) 
    [png:gAMA] => gamma=0.45454544 (See Gamma, above) 
    [png:IHDR.bit-depth-orig] => 4 
    [png:IHDR.bit_depth] => 4 
    [png:IHDR.color-type-orig] => 3 
    [png:IHDR.color_type] => 3 (Indexed) 
    [png:IHDR.interlace_method] => 0 (Not interlaced) 
    [png:IHDR.width,height] => 200, 200 
    [png:PLTE.number_colors] => 5 
    [png:sRGB] => intent=0 (Perceptual Intent) 
    [png:text] => 2 tEXt/zTXt/iTXt chunks were found 
    [png:tIME] => 2016-06-02T14:15:01Z 
) 
+0

Ví dụ này hoạt động nhưng khi tôi cố gắng so sánh hình ảnh của tôi, tôi vẫn nhận được 0. Tôi tự hỏi, nếu nó một cái gì đó để làm với so sánh 2 hình ảnh với chỉ minh bạch khác nhau? Vì giá trị màu không thay đổi nên tôi chỉ tin giá trị alpha. Vui lòng cho tôi biết bạn nghĩ gì về điều này ... – Mazzy

+0

Nếu bạn sử dụng chỉ số ABSOLUTE_ERROR, độ trong suốt sẽ bị bỏ qua. Tôi nghĩ nếu bạn thử RMSE_ERROR, nó sẽ tính đến tính minh bạch. Bạn có thể phải làm cho tất cả các điểm ảnh trong suốt trắng và tất cả các điểm ảnh mờ đen sau đó nhận được hình ảnh có nghĩa là để xác định tỷ lệ phần trăm của các điểm ảnh trắng. Truy cập vào đây http://www.imagemagick.org/Usage/compare/ và tìm kiếm trên trang đó cho '56755' và đọc đoạn đó. –

+0

Tôi đã cập nhật câu trả lời. –

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