| 436 | |
| 437 | |
| 438 | QImage Vectorizer::getClassifiedImage(double* qualityPtr, |
| 439 | ProgressObserver* progressObserver) |
| 440 | { |
| 441 | if (classifiedImage.isNull()) |
| 442 | { |
| 443 | classifiedImage = QImage(sourceImage.size(), QImage::Format_Indexed8); |
| 444 | classifiedImage.setColorCount(sourceImageColors.size()); |
| 445 | for (std::size_t i = 0; i < sourceImageColors.size(); i++) |
| 446 | { |
| 447 | classifiedImage.setColor(i, sourceImageColors[i]->getRGBTriplet()); |
| 448 | } |
| 449 | |
| 450 | std::vector<OrganizableElement*> classes(sourceImageColors.size()); |
| 451 | for (std::size_t i = 0; i < sourceImageColors.size(); i++) |
| 452 | classes[i] = sourceImageColors[i].get(); |
| 453 | |
| 454 | KohonenMap km; |
| 455 | km.setClasses(classes); |
| 456 | |
| 457 | auto mapFunctor = ClassificationMapper(sourceImageColors, km); |
| 458 | auto results = Concurrency::process<double>(progressObserver, mapFunctor, sourceImage, classifiedImage); |
| 459 | if (progressObserver && progressObserver->isInterruptionRequested()) |
| 460 | { |
| 461 | classifiedImage = QImage(); |
| 462 | quality = 0; |
| 463 | } |
| 464 | else |
| 465 | { |
| 466 | quality = std::accumulate(begin(results), end(results), 0.0, [](auto a, auto& b) { return a + b.future.result(); }); |
| 467 | } |
| 468 | } |
| 469 | |
| 470 | if (qualityPtr) *qualityPtr = quality; |
| 471 | |
| 472 | return classifiedImage; |
| 473 | } |
| 474 | |
| 475 | /*! Creates BW image where pixels are on positions where any of the selected |
| 476 | * colors were. Final image is also held in data member bwImage. |
no test coverage detected