图像ROI区域等比例新坐标计算
图像ROI区域等比例新坐标计算对原始ROI区域坐标进行新坐标计算转换到等比例的图像上再进行数据提取。第一种方法是把带ROI的图像放大或缩小从缩放之后的图像上遍历区域坐标这种方法根据缩放后的图像大小处理时间相应变化如从600*600转到2400*2400图像放大加遍历需要60ms。static const QPointF points[4] { QPointF(10.0, 80.0), QPointF(20.0, 10.0), QPointF(80.0, 30.0), QPointF(90.0, 70.0) }; QImage ii(600, 600, QImage::Format_RGB888); ii.fill(Qt::white); QPainter painter(ii); painter.setRenderHint(QPainter::Antialiasing, true); painter.setBrush(QBrush(Qt::red)); painter.setPen(QPen(Qt::red)); painter.drawPolygon(points, 4); painter.end(); ii.save(www.png, PNG); qint64 aa QDateTime::currentMSecsSinceEpoch(); ii ii.scaled(600 * 4, 600 * 4, Qt::KeepAspectRatio, Qt::SmoothTransformation); qDebug() QDateTime::currentMSecsSinceEpoch() - aa; aa QDateTime::currentMSecsSinceEpoch(); int h ii.height(); int w ii.width(); QListQPoint p; for (int i 0; i h; i) { for (int j 0; j w; j) { QRgb cc ii.pixel(j, i); if (QColor(qRed(cc), qGreen(cc), qBlue(cc)) Qt::red) { p.append(QPoint(j, i)); } } } qDebug() p.size() QDateTime::currentMSecsSinceEpoch() - aa; QImage ii2(600 * 4, 600 * 4, QImage::Format_RGB888); ii2.fill(Qt::white); foreach(QPoint pp, p) { ii2.setPixelColor(pp, Qt::red); } ii2.save(w.png, PNG);第二种方法是从带ROI的原始图像遍历区域坐标同时记录ROI边界范围再使用QPainter的scale替换原始图像的直接缩放如从600*600转到2400*2400图像绘制加遍历需要16ms主要时间在图像绘制。QImage ii(www.png); int h ii.height(); int w ii.width(); QListQPoint p; int minx 0; int maxx 0; int miny 0; int maxy 0; QListint xl; QListint yl; qint64 aa QDateTime::currentMSecsSinceEpoch(); for (int i 0; i h; i) { for (int j 0; j w; j) { QRgb cc ii.pixel(j, i); if (QColor(qRed(cc), qGreen(cc), qBlue(cc)) Qt::red) { p.append(QPoint(j, i)); xl.append(j); yl.append(i); } } } qDebug() p.size() QDateTime::currentMSecsSinceEpoch() - aa; aa QDateTime::currentMSecsSinceEpoch(); std::sort(xl.begin(), xl.end()); std::sort(yl.begin(), yl.end()); minx xl.first() * 4; maxx xl.last() * 4; miny yl.first() * 4; maxy yl.last() * 4; QImage ii4(2400, 2400, QImage::Format_RGB888); ii4.fill(Qt::white); QPainter painter(ii4); painter.setRenderHint(QPainter::Antialiasing, true); painter.setBrush(QBrush(Qt::red)); painter.setPen(QPen(Qt::red)); auto vec p.toVector(); painter.scale(4, 4); painter.drawPolygon(vec.data(), vec.size()); painter.end(); qDebug() p.size() QDateTime::currentMSecsSinceEpoch() - aa; aa QDateTime::currentMSecsSinceEpoch(); QListQPoint p2; for (int i miny; i maxy; i) { for (int j minx; j maxx; j) { QRgb cc ii4.pixel(j, i); if (QColor(qRed(cc), qGreen(cc), qBlue(cc)) Qt::red) { p2.append(QPoint(j, i)); } } } qDebug() p2.size() QDateTime::currentMSecsSinceEpoch() - aa; aa QDateTime::currentMSecsSinceEpoch(); QImage ii2(2400, 2400, QImage::Format_RGB888); ii2.fill(Qt::white); foreach(QPoint pp, p2) { ii2.setPixelColor(pp, Qt::red); } ii2.save(w0.png, PNG);第三种方法是从带ROI的原始图像遍历区域坐标同时记录ROI边界范围和每行的X坐标直接对坐标进行变换如从600*600转到2400*2400时间需要4ms。QImage ii(www.png); int h ii.height(); int w ii.width(); int minx 0; int maxx 0; int miny 0; int maxy 0; QListint xl; QListint yl; QMapint, QListint yymap; QMapint, QListint xxmap; QListint vv; qint64 aa QDateTime::currentMSecsSinceEpoch(); for (int i 0; i h; i) { for (int j 0; j w; j) { QRgb cc ii.pixel(j, i); if (QColor(qRed(cc), qGreen(cc), qBlue(cc)) Qt::red) { if (!xl.contains(j)) { xl.append(j); } if (!yl.contains(i)) { yl.append(i); } vv xxmap.value(i); vv.append(j); xxmap.insert(i, vv); } } } foreach (int kk, xxmap.keys()) { yymap.insert(kk, xxmap.value(kk)); } qDebug() QDateTime::currentMSecsSinceEpoch() - aa; aa QDateTime::currentMSecsSinceEpoch(); double xf 4.0; double yf 4.0; std::sort(xl.begin(), xl.end()); std::sort(yl.begin(), yl.end()); minx xl.first() * xf; maxx xl.last() * xf; miny yl.first() * yf; maxy yl.last() * yf; QListQPoint p2; for (int i miny; i maxy; i) { QListint xx yymap.value(i / yf); int x1 xx.first() * xf; int x2 xx.last() * xf; for (int j minx; j maxx; j) { if ((j x1) (j x2)) { p2.append(QPoint(j, i)); } } } qDebug() p2.size() QDateTime::currentMSecsSinceEpoch() - aa; aa QDateTime::currentMSecsSinceEpoch(); QImage ii2(2400, 2400, QImage::Format_RGB888); ii2.fill(Qt::white); foreach(QPoint pp, p2) { ii2.setPixelColor(pp, Qt::red); } ii2.save(w1.png, PNG);