結論から言うと失敗作というか、最小値と最大とのみを考慮して作られた式です。
はっきりいって使い物になりませんが、フリーソフトではつかっちゃっているようです。
動作確認用に作ったものなので、細かいエラーチェックは抜きです。
#===============================================================================
# RGB => CMYK(cmyが同じ値の場合kに割り振る)
#-------------------------------------------------------------------------------
sub rgb2cmyk {
	my $rgb = shift;
	$rgb =~ /^#?(..)(..)(..)$/;
	my %color = (
		'r' => hex( $1 ),
		'g' => hex( $2 ),
		'b' => hex( $3 ),
	);
	$color{'c'} = 1 - ( $color{'r'} / 255 );
	$color{'m'} = 1 - ( $color{'g'} / 255 );
	$color{'y'} = 1 - ( $color{'b'} / 255 );
	$color{'k'} = 0;
	if(
		   $color{'c'} == $color{'m'}
		|| $color{'m'} == $color{'k'}
	){
		$color{'k'} = $color{'c'};
		$color{'c'} = $color{'m'} = $color{'y'} = 0;
	}
	return %color;
}
結局、色を絞って変換テーブルを自作することになりましたけどね。
