Zadanie 3 - Histogram
This commit is contained in:
parent
a957e224f7
commit
722fcbfed2
@ -24,15 +24,63 @@ Histogram::~Histogram()
|
|||||||
|
|
||||||
void Histogram::generate(QImage* image)
|
void Histogram::generate(QImage* image)
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
qDebug() << Q_FUNC_INFO << "Histogram!";
|
||||||
|
qDebug() << Q_FUNC_INFO << image->height();
|
||||||
|
qDebug() << Q_FUNC_INFO << image->width();
|
||||||
|
for ( int row = 0; row < image->height(); ++row ) {
|
||||||
|
for ( int col = 0; col < image->width(); ++col ) {
|
||||||
|
QColor clrCurrent( image->pixel( row, col ) );
|
||||||
|
if (R->contains(clrCurrent.red())) {
|
||||||
|
R->insert(clrCurrent.red(), R->value(clrCurrent.red()) + 1);
|
||||||
|
} else {
|
||||||
|
R->insert(clrCurrent.red(), 1);
|
||||||
|
}
|
||||||
|
if (G->contains(clrCurrent.green())) {
|
||||||
|
G->insert(clrCurrent.green(), G->value(clrCurrent.green()) + 1);
|
||||||
|
} else {
|
||||||
|
G->insert(clrCurrent.green(), 1);
|
||||||
|
}
|
||||||
|
if (B->contains(clrCurrent.blue())) {
|
||||||
|
B->insert(clrCurrent.blue(), B->value(clrCurrent.blue()) + 1);
|
||||||
|
} else {
|
||||||
|
B->insert(clrCurrent.blue(), 1);
|
||||||
|
}
|
||||||
|
if (L->contains(clrCurrent.alpha())) {
|
||||||
|
L->insert(clrCurrent.alpha(), L->value(clrCurrent.alpha()) + 1);
|
||||||
|
} else {
|
||||||
|
L->insert(clrCurrent.alpha(), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the maximal value of the histogram in the given channel */
|
/** Returns the maximal value of the histogram in the given channel */
|
||||||
int Histogram::maximumValue(Channel selectedChannel = RGB)
|
int Histogram::maximumValue(Channel selectedChannel = RGB)
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
qDebug() << Q_FUNC_INFO << "Max value!";
|
||||||
|
qDebug() << Q_FUNC_INFO << selectedChannel;
|
||||||
|
int max = 1;
|
||||||
|
|
||||||
return 0;
|
if (selectedChannel == RGB) {
|
||||||
|
qDebug() << Q_FUNC_INFO << "RGB";
|
||||||
|
max = maximumValue(RChannel);
|
||||||
|
int maxG = maximumValue(GChannel);
|
||||||
|
if (maxG > max) {
|
||||||
|
max = maxG;
|
||||||
|
}
|
||||||
|
int maxB = maximumValue(BChannel);
|
||||||
|
if (maxB > max) {
|
||||||
|
max = maxB;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
qDebug() << Q_FUNC_INFO << "selectedChannel";
|
||||||
|
foreach(int value, get(selectedChannel)->values()) {
|
||||||
|
if (value > max) {
|
||||||
|
max = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,7 +19,91 @@ PNM* HistogramEqualization::transform()
|
|||||||
|
|
||||||
PNM* newImage = new PNM(width, height, image->format());
|
PNM* newImage = new PNM(width, height, image->format());
|
||||||
|
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
if (image->format() == QImage::Format_Indexed8) {
|
||||||
|
double prob[256] = { 0.0 };
|
||||||
|
|
||||||
|
Histogram::Channel channelL = Histogram::Channel::LChannel;
|
||||||
|
QHash<int, int>* histL = image->getHistogram()->get(channelL);
|
||||||
|
|
||||||
|
QHash<int, int>::const_iterator i = histL->constBegin();
|
||||||
|
while (i != histL->constEnd()) {
|
||||||
|
prob[i.key()] = (double)i.value() / (double)(width * height);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
double distr[256] = { prob[0] };
|
||||||
|
|
||||||
|
for (int i = 1; i < 256; i++) {
|
||||||
|
distr[i] = distr[i - 1] + prob[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
|
distr[i] = distr[i] * 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
newImage->setPixel(x, y, (int)distr[qGray(image->pixel(x, y))]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
double probR[256] = { 0.0 };
|
||||||
|
double probG[256] = { 0.0 };
|
||||||
|
double probB[256] = { 0.0 };
|
||||||
|
|
||||||
|
Histogram::Channel channelR = Histogram::Channel::RChannel;
|
||||||
|
Histogram::Channel channelG = Histogram::Channel::GChannel;
|
||||||
|
Histogram::Channel channelB = Histogram::Channel::BChannel;
|
||||||
|
QHash<int, int>* histR = image->getHistogram()->get(channelR);
|
||||||
|
QHash<int, int>* histG = image->getHistogram()->get(channelG);
|
||||||
|
QHash<int, int>* histB = image->getHistogram()->get(channelB);
|
||||||
|
|
||||||
|
QHash<int, int>::const_iterator iR = histR->constBegin();
|
||||||
|
while (iR != histR->constEnd()) {
|
||||||
|
probR[iR.key()] = (double)iR.value() / (double)(width * height);
|
||||||
|
++iR;
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, int>::const_iterator iG = histG->constBegin();
|
||||||
|
while (iG != histG->constEnd()) {
|
||||||
|
probG[iG.key()] = (double)iG.value() / (double)(width * height);
|
||||||
|
++iG;
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, int>::const_iterator iB = histB->constBegin();
|
||||||
|
while (iB != histB->constEnd()) {
|
||||||
|
probB[iB.key()] = (double)iB.value() / (double)(width * height);
|
||||||
|
++iB;
|
||||||
|
}
|
||||||
|
|
||||||
|
double distrR[256] = { probR[0] };
|
||||||
|
double distrG[256] = { probG[0] };
|
||||||
|
double distrB[256] = { probB[0] };
|
||||||
|
|
||||||
|
for (int i = 1; i < 256; i++) {
|
||||||
|
distrR[i] = distrR[i - 1] + probR[i];
|
||||||
|
distrG[i] = distrG[i - 1] + probG[i];
|
||||||
|
distrB[i] = distrB[i - 1] + probB[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
|
distrR[i] = distrR[i] * 255;
|
||||||
|
distrG[i] = distrG[i] * 255;
|
||||||
|
distrB[i] = distrB[i] * 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
for (int j = 0; j < height; j++) {
|
||||||
|
int r = (int) distrR[qRed( image->pixel(i,j))];
|
||||||
|
int g = (int) distrG[qGreen(image->pixel(i,j))];
|
||||||
|
int b = (int) distrB[qBlue(image->pixel(i,j))];
|
||||||
|
|
||||||
|
newImage->setPixel(i, j, QColor(r,g,b).rgb());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return newImage;
|
return newImage;
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,100 @@ PNM* HistogramStretching::transform()
|
|||||||
int width = image->width();
|
int width = image->width();
|
||||||
int height = image->height();
|
int height = image->height();
|
||||||
|
|
||||||
|
int minR = INT_MAX;
|
||||||
|
int maxR = INT_MIN;
|
||||||
|
int minG = INT_MAX;
|
||||||
|
int maxG = INT_MIN;
|
||||||
|
int minB = INT_MAX;
|
||||||
|
int maxB = INT_MIN;
|
||||||
|
|
||||||
PNM* newImage = new PNM(width, height, image->format());
|
PNM* newImage = new PNM(width, height, image->format());
|
||||||
|
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
if (image->format() == QImage::Format_Indexed8) {
|
||||||
|
Histogram::Channel channelL = Histogram::Channel::LChannel;
|
||||||
|
QHash<int, int>* histL = image->getHistogram()->get(channelL);
|
||||||
|
int minL = INT_MAX;
|
||||||
|
int maxL = INT_MIN;
|
||||||
|
|
||||||
|
QHash<int, int>::const_iterator i = histL->constBegin();
|
||||||
|
while (i != histL->constEnd()) {
|
||||||
|
if (i.key() < minL && i.value() > 0) {
|
||||||
|
minL = i.key();
|
||||||
|
}
|
||||||
|
if (i.key() > maxL && i.value() > 0) {
|
||||||
|
maxL = i.key();
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
for (int j = 0; j < height; j++) {
|
||||||
|
int l = (255 * (qGray(image->pixel(i,j)) - minL)) /(maxL - minL);
|
||||||
|
newImage->setPixel(i,j,l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
Histogram::Channel channelR = Histogram::Channel::RChannel;
|
||||||
|
Histogram::Channel channelG = Histogram::Channel::GChannel;
|
||||||
|
Histogram::Channel channelB = Histogram::Channel::BChannel;
|
||||||
|
QHash<int, int>* histR = image->getHistogram()->get(channelR);
|
||||||
|
QHash<int, int>* histG = image->getHistogram()->get(channelG);
|
||||||
|
QHash<int, int>* histB = image->getHistogram()->get(channelB);
|
||||||
|
|
||||||
|
foreach(int i, histR->keys()) {
|
||||||
|
if (i < minR && histR->value(i) > 0) {
|
||||||
|
minR = i;
|
||||||
|
}
|
||||||
|
if (i > maxR && histR->value(i) > 0) {
|
||||||
|
maxR = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, int>::const_iterator iR = histR->constBegin();
|
||||||
|
while (iR != histR->constEnd()) {
|
||||||
|
if (iR.key() < minR && iR.value() > 0) {
|
||||||
|
minR = iR.key();
|
||||||
|
}
|
||||||
|
if (iR.key() > maxR && iR.value() > 0) {
|
||||||
|
maxR = iR.key();
|
||||||
|
}
|
||||||
|
++iR;
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, int>::const_iterator iG = histG->constBegin();
|
||||||
|
while (iG != histG->constEnd()) {
|
||||||
|
if (iG.key() < minG && iG.value() > 0) {
|
||||||
|
minG = iG.key();
|
||||||
|
}
|
||||||
|
if (iG.key() > maxG && iG.value() > 0) {
|
||||||
|
maxG = iG.key();
|
||||||
|
}
|
||||||
|
++iG;
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, int>::const_iterator iB = histB->constBegin();
|
||||||
|
while (iB != histB->constEnd()) {
|
||||||
|
if (iB.key() < minB && iB.value() > 0) {
|
||||||
|
minB = iB.key();
|
||||||
|
}
|
||||||
|
if (iB.key() > maxB && iB.value() > 0) {
|
||||||
|
maxB = iB.key();
|
||||||
|
}
|
||||||
|
++iB;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
for (int j = 0; j < height; j++) {
|
||||||
|
int r = (255 * (qRed(image->pixel(i,j)) - minR)) / (maxR - minR);
|
||||||
|
int g = (255 * (qGreen(image->pixel(i,j)) - minG)) / (maxG - minG);
|
||||||
|
int b = (255 * (qBlue(image->pixel(i,j)) - minB)) / (maxB - minB);
|
||||||
|
|
||||||
|
newImage->setPixel(i,j,QColor(r,g,b).rgb());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return newImage;
|
return newImage;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user