Prewittフィルタに重みづけがされたフィルタです.
これがSobelフィルタの式ですがアルゴリズム的には全くかわりません.
for(i=1; i<img->height-1; i++){ for(j=1; j<img->width-1; j++){ sumrw = sumrh = sumgw = sumgh = sumbw = sumbh = 0; for(k=-1; k<=1; k++){ for(l=-1; l<=1; l++){ sumrw += (!k ? 2*l : l) * img->data[(i+k)*img->width + j + l].r; sumrh += (!l ? 2*k : k) * img->data[(i+k)*img->width + j + l].r; sumgw += (!k ? 2*l : l) * img->data[(i+k)*img->width + j + l].g; sumgh += (!l ? 2*k : k) * img->data[(i+k)*img->width + j + l].g; sumbw += (!k ? 2*l : l) * img->data[(i+k)*img->width + j + l].b; sumbh += (!l ? 2*k : k) * img->data[(i+k)*img->width + j + l].b; } } temp->data[i*temp->width + j].r = sqrt((double)(sumrw*sumrw + sumrh*sumrh)); temp->data[i*temp->width + j].g = sqrt((double)(sumgw*sumgw + sumgh*sumgh)); temp->data[i*temp->width + j].b = sqrt((double)(sumbw*sumbw + sumbh*sumbh)); } }
SobelフィルタでもPrewitt同様最後に
を計算しています.