Zadanie 3 - Histogram

This commit is contained in:
Kamila Malanowicz 2020-04-14 20:43:28 +02:00
parent a957e224f7
commit 722fcbfed2
3 changed files with 228 additions and 5 deletions

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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;
} }