改变 <QBitmap> / <QImage> 的对比度
Changing <QBitmap> / <QImage>'s contrast
我使用了一个示例代码(来源:https://forum.qt.io/topic/11390/increasing-contrast-of-qimage/4)来改变 QImage 的对比度(我也对其进行了一些编辑):
void SetBetween0and255(double& value)
{
if(value > 255)
value = 255;
if(value < 0)
value = 0;
}
void CreateHistogram(QMap<QRgb,long>& histo, QImage& image)
{
QRgb c = 0;
int l, k;
histo.clear();
for(k = 0; k < image.width(); ++k)
for( l = 0; l < image.height(); ++l) {
c = image.pixel(k,l);
if(!histo.contains(c))
histo.insert(c,0);
}
//computation of occurences
for( k = 0; k < image.width(); ++k)
for( l = 0; l < image.height(); ++l) {
c = image.pixel(k,l);
histo[c] = histo[c]+1;
}
}
void ImageViewer::ChangeContrast()
{
newImage = image.copy();
QMap<QRgb,long> histo; // histogram map
CreateHistogram(histo, newImage);
//compute average value
long sum_1 = 0, sum_2 = 0;
QMap<QRgb,long>::iterator j;
for(j = histo.begin();j!=histo.end();j++) {
sum_1+=j.value()*j.key();
}
for(j = histo.begin();j!=histo.end();j++) {
sum_2+=j.value();
}
long av = sum_1/sum_2;
//changing contrast of an newImage by factor getted from horizontal slider ui:
double factor = (double)( (double)sliderBar->value() )/100 ; // to change also
QRgb c = 0;
int l, k, r = qRed(av), g = qGreen(av), b = qBlue(av);
if(factor!=1)
for (l = 0; l < newImage.height(); ++l) {
for (k = 0; k < newImage.width(); ++k) {
c = QRgb(newImage.pixel(k,l));
QColor col(c);
col.getRgb(&r,&g,&b);
double r_n = r / 255.0;
r_n -= 0.5; r_n *= factor;
r_n += 0.5; r_n *= 255;
double g_n = g / 255.0;
g_n -= 0.5; g_n *= factor;
g_n += 0.5; g_n *= 255;
double b_n = b / 255.0;
b_n -= 0.5; b_n *= factor;
b_n += 0.5; b_n *= 255;
SetBetween0and255(r_n);
SetBetween0and255(g_n);
SetBetween0and255(b_n);
newImage.setPixel(k,l,qRgb((int)r_n,(int)g_n,(int)b_n));
}
}
setImage(newImage);
}
但是感觉下面几行代码有问题:
r_n -= 0.5; r_n *= factor;
r_n += 0.5; r_n *= 255;
double g_n = g / 255.0;
g_n -= 0.5; g_n *= factor;
g_n += 0.5; g_n *= 255;
double b_n = b / 255.0;
b_n -= 0.5; b_n *= factor;
b_n += 0.5; b_n *= 255;
有什么我可以在这里更正以更改图像的实际对比度吗?因为现在发生的事情是生成的图像 (newImage) 仅将其颜色更改为更“灰色”,并且当“factor”增加其值时它变为 100% 灰色。 “factor”变量越多,图像的“灰度”越多,看起来不像我真的在改变对比度。
我只需将因子变量从 ~1 设置为 ~30 即可通过将这些值提供给函数来更改对比度,而 QSlider 返回了不正确的值。
也可以通过传递 -1 到 -30 之间的值来反转图像颜色,同时更改反转图像的对比度。
所以正确的代码如下:
// creating QSpinBox instead of QSlider and doing stuff
//...
QSpinBox *qSpinBox = new QSpinBox(this);
int height = 100, int width = 10;
QSpinBox->move(width, height); ( move it manually somewhere to see the spinbox widget clear )
//...
//from 1 to 30 || from -1 to -30
double factor = (double)( (double)qSpinBox->value() )/100 ;
我使用了一个示例代码(来源:https://forum.qt.io/topic/11390/increasing-contrast-of-qimage/4)来改变 QImage 的对比度(我也对其进行了一些编辑):
void SetBetween0and255(double& value)
{
if(value > 255)
value = 255;
if(value < 0)
value = 0;
}
void CreateHistogram(QMap<QRgb,long>& histo, QImage& image)
{
QRgb c = 0;
int l, k;
histo.clear();
for(k = 0; k < image.width(); ++k)
for( l = 0; l < image.height(); ++l) {
c = image.pixel(k,l);
if(!histo.contains(c))
histo.insert(c,0);
}
//computation of occurences
for( k = 0; k < image.width(); ++k)
for( l = 0; l < image.height(); ++l) {
c = image.pixel(k,l);
histo[c] = histo[c]+1;
}
}
void ImageViewer::ChangeContrast()
{
newImage = image.copy();
QMap<QRgb,long> histo; // histogram map
CreateHistogram(histo, newImage);
//compute average value
long sum_1 = 0, sum_2 = 0;
QMap<QRgb,long>::iterator j;
for(j = histo.begin();j!=histo.end();j++) {
sum_1+=j.value()*j.key();
}
for(j = histo.begin();j!=histo.end();j++) {
sum_2+=j.value();
}
long av = sum_1/sum_2;
//changing contrast of an newImage by factor getted from horizontal slider ui:
double factor = (double)( (double)sliderBar->value() )/100 ; // to change also
QRgb c = 0;
int l, k, r = qRed(av), g = qGreen(av), b = qBlue(av);
if(factor!=1)
for (l = 0; l < newImage.height(); ++l) {
for (k = 0; k < newImage.width(); ++k) {
c = QRgb(newImage.pixel(k,l));
QColor col(c);
col.getRgb(&r,&g,&b);
double r_n = r / 255.0;
r_n -= 0.5; r_n *= factor;
r_n += 0.5; r_n *= 255;
double g_n = g / 255.0;
g_n -= 0.5; g_n *= factor;
g_n += 0.5; g_n *= 255;
double b_n = b / 255.0;
b_n -= 0.5; b_n *= factor;
b_n += 0.5; b_n *= 255;
SetBetween0and255(r_n);
SetBetween0and255(g_n);
SetBetween0and255(b_n);
newImage.setPixel(k,l,qRgb((int)r_n,(int)g_n,(int)b_n));
}
}
setImage(newImage);
}
但是感觉下面几行代码有问题:
r_n -= 0.5; r_n *= factor;
r_n += 0.5; r_n *= 255;
double g_n = g / 255.0;
g_n -= 0.5; g_n *= factor;
g_n += 0.5; g_n *= 255;
double b_n = b / 255.0;
b_n -= 0.5; b_n *= factor;
b_n += 0.5; b_n *= 255;
有什么我可以在这里更正以更改图像的实际对比度吗?因为现在发生的事情是生成的图像 (newImage) 仅将其颜色更改为更“灰色”,并且当“factor”增加其值时它变为 100% 灰色。 “factor”变量越多,图像的“灰度”越多,看起来不像我真的在改变对比度。
我只需将因子变量从 ~1 设置为 ~30 即可通过将这些值提供给函数来更改对比度,而 QSlider 返回了不正确的值。
也可以通过传递 -1 到 -30 之间的值来反转图像颜色,同时更改反转图像的对比度。
所以正确的代码如下:
// creating QSpinBox instead of QSlider and doing stuff
//...
QSpinBox *qSpinBox = new QSpinBox(this);
int height = 100, int width = 10;
QSpinBox->move(width, height); ( move it manually somewhere to see the spinbox widget clear )
//...
//from 1 to 30 || from -1 to -30
double factor = (double)( (double)qSpinBox->value() )/100 ;