나는 다음과 같은 기능을 사용하여 일부 미리 정의 된 색상에 내 이미지 색상을 줄이기 위해 노력하는 실험실 색상 양자화 :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 (int j = 0; j
api55
@ api55 실제로 "i"는 행 (노트 i + = lab_img.cols * 3) 및 "j"단계 (col = j + 3)에 대해 단계를 밟습니다. 그래서 루프가 올바른 것처럼 보입니다. 물론 팁은 코드 개선에 유용합니다. 감사합니다 –
사실, 나는 혼란스러워. 나는 어떤 실수도 지금 보지 않는다, 나는 그것을 달리게하려고 노력할 것이다. 나에게 결과는 모든 숫자가 처음에는 (붉은 색을 제외하고) 양수이지만, opencv 컨벤션으로의 전환은 괜찮아 보인다는 것을 알 수있다 .... 확실하지 않은 이유 – api55