私は次の関数使用して、いくつかの定義済みの色に私のイメージの色を削減しようとしている:正常に動作していないようしかしOpenCVの:ラボカラー量子化事前に定義された色に
void quantize_img(cv::Mat &lab_img, std::vector<cv::Scalar> &lab_colors) {
float min_dist, dist;
int min_idx;
for (int i = 0; i < lab_img.rows*lab_img.cols * 3; i += lab_img.cols * 3) {
for (int j = 0; j < lab_img.cols * 3; j += 3) {
min_dist = FLT_MAX;
uchar &l = *(lab_img.data + i + j + 0);
uchar &a = *(lab_img.data + i + j + 1);
uchar &b = *(lab_img.data + i + j + 2);
for (int k = 0; k < lab_colors.size(); k++) {
double &lc = lab_colors[k](0);
double &ac = lab_colors[k](1);
double &bc = lab_colors[k](2);
dist = (l - lc)*(l - lc)+(a - ac)*(a - ac)+(b - bc)*(b - bc);
if (min_dist > dist) {
min_dist = dist;
min_idx = k;
}
}
l = lab_colors[min_idx](0);
a = lab_colors[min_idx](1);
b = lab_colors[min_idx](2);
}
}
}
を!たとえば、次の入力の出力は素晴らしいようです!
if (!(src = imread("im0.png")).data)
return -1;
cvtColor(src, lab, COLOR_BGR2Lab);
std::vector<cv::Scalar> lab_color_plate_({
Scalar(100, 0 , 0), //white
Scalar(50 , 0 , 0), //gray
Scalar(0 , 0 , 0), //black
Scalar(50 , 127, 127), //red
Scalar(50 ,-128, 127), //green
Scalar(50 , 127,-128), //violet
Scalar(50 ,-128,-128), //blue
Scalar(68 , 46 , 75), //orange
Scalar(100,-16 , 93) //yellow
});
//convert from conventional Lab to OpenCV Lab
for (int k = 0; k < lab_color_plate_.size(); k++) {
lab_color_plate_[k](0) *= 255.0/100.0;
lab_color_plate_[k](1) += 128;
lab_color_plate_[k](2) += 128;
}
quantize_img(lab, lab_color_plate_);
cvtColor(lab, lab, CV_Lab2BGR);
imwrite("im0_lab.png", lab);
問題がどこにあるか誰もが説明できますか?
jをちょうど必要とする場合、すべてのピクセル(iのfor)に対して既に反復している場合、 'for(int j = 0; j
api55
@ api55実際には「i」は行(ステップi + = lab_img.cols * 3)に、ステップ「j」は列(j + = 3)にステップインします。だから、ループは正しいようです。もちろん、あなたのヒントはコードを改善する上では間違いありません。ありがとう –
本当に、私は混乱した。私は間違いを今見ていない、私はそれとSEを実行しようとします。私にとっては、結果はすべての数字が最初は陽性(赤を除く)であるが、opencvのコンベンションへの変換はOKと思われます。確信していませんなぜ – api55