Sobel 过滤器上的这段代码有什么问题?
What is wrong with this code on Sobel filter?
我正在尝试在 PHP GD 中实现一个 sobel 过滤器,但我的代码有问题:
$gd = imagecreatefrompng('base.png');
$width = imagesx($gd);
$height = imagesx($gd);
for($i=1; $i<$width-1;$i++){
for($j=1;$j<$height-1; $j++){
$pixelMatrix[0][0]= getColor($gd, $i-1,$j-1);
$pixelMatrix[0][1]= getColor($gd, $i-1,$j);
$pixelMatrix[0][2]= getColor($gd, $i-1,$j+1);
$pixelMatrix[1][0]= getColor($gd, $i,$j-1);
$pixelMatrix[1][2]= getColor($gd, $i,$j+1);
$pixelMatrix[2][0]= getColor($gd, $i+1,$j-1);
$pixelMatrix[2][1]= getColor($gd, $i+1,$j);
$pixelMatrix[2][2]= getColor($gd, $i+1,$j+1);
$edge=(int) convolution($pixelMatrix);
if($edge>255) $edge = 255;
imagesetpixel($gd, $i, $j, imagecolorallocate($gd,$edge,$edge,$edge));
}
}
function getColor($gd, $x, $y){
$rgb = @imagecolorat($gd, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return round($r * 0.3 + $g * 0.59 + $b * 0.11); // gray
}
function convolution($pixelMatrix){
$gy=($pixelMatrix[0][0]*-1)+($pixelMatrix[0][1]*-2)+($pixelMatrix[0][2]*-1)+($pixelMatrix[2][0])+($pixelMatrix[2][1]*2)+($pixelMatrix[2][2]*1);
$gx=($pixelMatrix[0][0])+($pixelMatrix[0][2]*-1)+($pixelMatrix[1][0]*2)+($pixelMatrix[1][2]*-2)+($pixelMatrix[2][0])+($pixelMatrix[2][2]*-1);
return sqrt(pow($gy,2)+pow($gx,2));
}
// send PNG to browser
header("Content-type: image/png");
imagepng($gd);
基本图像:
正确的结果图片:
我的结果:
对于此图像,边缘包含一个 0-990 的整数,因此我将其限制为 255。如果我移除上限,我得到的只是噪声。我猜错误是在将边缘转换为 imagesetpixel 中的 RGB 值(我不明白那部分)时,不是吗?
如注释中所标记,有一些错误,但您的大部分代码都非常正确。
主要有:
- 输入图像可能是调色板,所以制作真彩色
- 无法就地执行 Sobel - 您需要输出图像
- 你在获取高度的地方有错字
我想主要就是这些了!
$gd = imagecreatefrompng('base.png');
imagepalettetotruecolor($gd); // IN CASE PALETTISED
$width = imagesx($gd);
$height = imagesy($gd); // NOT imagesx()
$result=imagecreatetruecolor($width,$height); // CREATE OUTPUT IMAGE
for($i=1; $i<$width-1;$i++){
for($j=1;$j<$height-1; $j++){
$pixelMatrix[0][0]= getColor($gd, $i-1,$j-1);
$pixelMatrix[0][1]= getColor($gd, $i-1,$j);
$pixelMatrix[0][2]= getColor($gd, $i-1,$j+1);
$pixelMatrix[1][0]= getColor($gd, $i,$j-1);
$pixelMatrix[1][2]= getColor($gd, $i,$j+1);
$pixelMatrix[2][0]= getColor($gd, $i+1,$j-1);
$pixelMatrix[2][1]= getColor($gd, $i+1,$j);
$pixelMatrix[2][2]= getColor($gd, $i+1,$j+1);
$edge=(int) convolution($pixelMatrix);
if($edge>255) $edge = 255;
imagesetpixel($result, $i, $j, imagecolorallocate($result,$edge,$edge,$edge));
}
}
imagepng($result,"result.png");
function getColor($gd, $x, $y){
$rgb = @imagecolorat($gd, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return round($r * 0.3 + $g * 0.59 + $b * 0.11); // gray
}
function convolution($pixelMatrix){
$gy=($pixelMatrix[0][0]*-1)+($pixelMatrix[0][1]*-2)+($pixelMatrix[0][2]*-1)+($pixelMatrix[2][0])+($pixelMatrix[2][1]*2)+($pixelMatrix[2][2]*1);
$gx=($pixelMatrix[0][0])+($pixelMatrix[0][2]*-1)+($pixelMatrix[1][0]*2)+($pixelMatrix[1][2]*-2)+($pixelMatrix[2][0])+($pixelMatrix[2][2]*-1);
return sqrt(pow($gy,2)+pow($gx,2));
}
我正在尝试在 PHP GD 中实现一个 sobel 过滤器,但我的代码有问题:
$gd = imagecreatefrompng('base.png');
$width = imagesx($gd);
$height = imagesx($gd);
for($i=1; $i<$width-1;$i++){
for($j=1;$j<$height-1; $j++){
$pixelMatrix[0][0]= getColor($gd, $i-1,$j-1);
$pixelMatrix[0][1]= getColor($gd, $i-1,$j);
$pixelMatrix[0][2]= getColor($gd, $i-1,$j+1);
$pixelMatrix[1][0]= getColor($gd, $i,$j-1);
$pixelMatrix[1][2]= getColor($gd, $i,$j+1);
$pixelMatrix[2][0]= getColor($gd, $i+1,$j-1);
$pixelMatrix[2][1]= getColor($gd, $i+1,$j);
$pixelMatrix[2][2]= getColor($gd, $i+1,$j+1);
$edge=(int) convolution($pixelMatrix);
if($edge>255) $edge = 255;
imagesetpixel($gd, $i, $j, imagecolorallocate($gd,$edge,$edge,$edge));
}
}
function getColor($gd, $x, $y){
$rgb = @imagecolorat($gd, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return round($r * 0.3 + $g * 0.59 + $b * 0.11); // gray
}
function convolution($pixelMatrix){
$gy=($pixelMatrix[0][0]*-1)+($pixelMatrix[0][1]*-2)+($pixelMatrix[0][2]*-1)+($pixelMatrix[2][0])+($pixelMatrix[2][1]*2)+($pixelMatrix[2][2]*1);
$gx=($pixelMatrix[0][0])+($pixelMatrix[0][2]*-1)+($pixelMatrix[1][0]*2)+($pixelMatrix[1][2]*-2)+($pixelMatrix[2][0])+($pixelMatrix[2][2]*-1);
return sqrt(pow($gy,2)+pow($gx,2));
}
// send PNG to browser
header("Content-type: image/png");
imagepng($gd);
基本图像:
正确的结果图片:
我的结果:
对于此图像,边缘包含一个 0-990 的整数,因此我将其限制为 255。如果我移除上限,我得到的只是噪声。我猜错误是在将边缘转换为 imagesetpixel 中的 RGB 值(我不明白那部分)时,不是吗?
如注释中所标记,有一些错误,但您的大部分代码都非常正确。
主要有:
- 输入图像可能是调色板,所以制作真彩色
- 无法就地执行 Sobel - 您需要输出图像
- 你在获取高度的地方有错字
我想主要就是这些了!
$gd = imagecreatefrompng('base.png');
imagepalettetotruecolor($gd); // IN CASE PALETTISED
$width = imagesx($gd);
$height = imagesy($gd); // NOT imagesx()
$result=imagecreatetruecolor($width,$height); // CREATE OUTPUT IMAGE
for($i=1; $i<$width-1;$i++){
for($j=1;$j<$height-1; $j++){
$pixelMatrix[0][0]= getColor($gd, $i-1,$j-1);
$pixelMatrix[0][1]= getColor($gd, $i-1,$j);
$pixelMatrix[0][2]= getColor($gd, $i-1,$j+1);
$pixelMatrix[1][0]= getColor($gd, $i,$j-1);
$pixelMatrix[1][2]= getColor($gd, $i,$j+1);
$pixelMatrix[2][0]= getColor($gd, $i+1,$j-1);
$pixelMatrix[2][1]= getColor($gd, $i+1,$j);
$pixelMatrix[2][2]= getColor($gd, $i+1,$j+1);
$edge=(int) convolution($pixelMatrix);
if($edge>255) $edge = 255;
imagesetpixel($result, $i, $j, imagecolorallocate($result,$edge,$edge,$edge));
}
}
imagepng($result,"result.png");
function getColor($gd, $x, $y){
$rgb = @imagecolorat($gd, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return round($r * 0.3 + $g * 0.59 + $b * 0.11); // gray
}
function convolution($pixelMatrix){
$gy=($pixelMatrix[0][0]*-1)+($pixelMatrix[0][1]*-2)+($pixelMatrix[0][2]*-1)+($pixelMatrix[2][0])+($pixelMatrix[2][1]*2)+($pixelMatrix[2][2]*1);
$gx=($pixelMatrix[0][0])+($pixelMatrix[0][2]*-1)+($pixelMatrix[1][0]*2)+($pixelMatrix[1][2]*-2)+($pixelMatrix[2][0])+($pixelMatrix[2][2]*-1);
return sqrt(pow($gy,2)+pow($gx,2));
}