Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP imageconvolution() 함수로 이미지에 3×3 컨볼루션 행렬 적용하기

imageconvolution()은 PHP의 내장 함수로, 이미지에 3×3 컨볼루션(convolution, 회선) 행렬을 계수와 오프셋 값과 함께 적용할 때 사용됩니다. 이 함수를 활용하면 이미지 선명화(sharpening), 가우시안 블러(Gaussian blur), 엠보싱 등 다양한 이미지 필터 효과를 손쉽게 구현할 수 있습니다.

문법(Syntax)

bool imageconvolution($image, $matrix, $div, $offset)

매개변수(Parameters)

imageconvolution() 함수는 총 네 개의 매개변수인 $image, $matrix, $div, $offset을 받습니다.

  • $image − 컨볼루션을 적용할 대상 이미지입니다. imagecreatetruecolor()와 같은 이미지 생성 함수를 통해 만든 이미지 리소스를 전달합니다.

  • $matrix − 적용할 3×3 크기의 실수(float) 배열 형태의 컨볼루션 행렬입니다.

  • $div − 행렬 연산 결과를 정규화(normalization)하기 위한 나눗셈 계수입니다.

  • $offset − 최종 픽셀 색상에 더해지는 색상 오프셋 값입니다.

반환 값(Return Values)

imageconvolution() 함수는 성공 시 true를, 실패 시 false를 반환합니다.

예제 1: 이미지 선명화 효과

<?php
    // imagecreatefrompng() 함수로 PNG 이미지를 불러옵니다.
    $image = imagecreatefrompng('C:\xampp\htdocs\Images\img59.png');
    
    // 3×3 배열 형태의 컨볼루션 행렬을 정의합니다.
    $matrix = array(
        array(2, 0, 0),
        array(0, -1, 0),
        array(0, 0, -1)
    );
    // imageconvolution() 함수로 이미지 요소를 변형합니다.
    imageconvolution($image, $matrix, 1, 127);

    // 처리된 결과 이미지를 브라우저에 출력합니다.
    header('Content-Type: image/png');
    imagepng($image, null, 9);
?>

출력 결과

imageconvolution() 함수 적용 전의 원본 PNG 이미지

PHP imageconvolution() 함수로 이미지에 3×3 컨볼루션 행렬 적용하기

imageconvolution() 함수 적용 후의 결과 PNG 이미지

PHP imageconvolution() 함수로 이미지에 3×3 컨볼루션 행렬 적용하기

예제 2: 가우시안 블러 효과

<?php
    $image = imagecreatetruecolor(700, 300);
    
    // 텍스트를 작성한 뒤 이미지에 가우시안 블러를 적용합니다.
    imagestring($image, 50, 25, 8, 'Gaussian Blur Text image', 0x00ff00);
    $gaussian = array(
        array(1.0, 2.0, 1.0),
        array(2.0, 4.0, 2.0),
        array(1.0, 2.0, 1.0)
    );
    imageconvolution($image, $gaussian, 16, 0);

    // 비교를 위해 블러가 적용되지 않은 텍스트를 다시 작성합니다.
    imagestring($image, 15, 20, 18, 'Gaussian Blur Text image', 0x00ff00);
    header('Content-Type: image/png');
    imagepng($image, null, 9);
?>

출력 결과

PHP imageconvolution() 함수로 이미지에 3×3 컨볼루션 행렬 적용하기

위 예제에서 볼 수 있듯이, 가우시안 행렬의 각 요소 합이 16이므로 $div 값을 16으로 지정하면 이미지의 전체 밝기가 유지된 상태로 부드러운 블러 효과를 얻을 수 있습니다. 반면 $div 값이 행렬 요소의 합과 일치하지 않으면 이미지가 밝아지거나 어두워질 수 있으므로 주의해야 합니다.