初学数字图像处理。这里是使用QImage结合QCustomPlot实现一个图像的灰度直方图的展示。由于是初学,错误的地方,欢迎大家拍砖。
Qt提供了QImage类,可以直接访问和操作像素。QCustomPlot用于展示灰度直方图。
几个概念:
灰度图像不同于黑白图像。黑白图像只有黑色和白色,灰度图像除了黑色和白色之外,还有许多级的颜色深度。可以认为黑白图像是灰度图像的一种特例。
灰度图像经常是在单个电磁波频率如可见光内测量每个像素的亮度得到。(摘自wiki)
灰度是表示图像明暗的数值。即颜色深度。灰度值,表示单个像素点的亮度。灰度越大表示越亮。
彩色图像灰度化:对于灰度图像而言,它的RGB分量相等,图像的每个像素点都满足R=G=B。而彩色图像的RGB分量是不等的,则需要通灰度化(函数映射)来转换。通常的灰度化处理方法有:
1.浮点算法:Gray=R*0.3+G*0.59+B*0.11 R=G=B
2.整数方法:Gray=(R*30+G*59+B*11)/100 R=G=B
3.移位方法:Gray =(R*28+G*151+B*77)>>8 R=G=B
4.平均值法:Gray=(R+G+B)/3 R=G=B
5.仅取绿色:Gray=G
灰度图像,并不是没有颜色,因为它的RGB分量相等。由下图可知,RGB的交集是白色,不同亮度的RGB的交集则呈现出白灰黑。
灰度图像的RGB分量相等,则每个像素只需要保存单色值即可,无须单独保存RGB三色颜色。灰度图像通常是8位的。图像每个像素的像素值,是颜色值,也是灰度值。
了解了这些概念之后,那么思路就非常清晰了。 我们只需要遍历图片的像素值,统计不同灰度值的出现的次数,用图表展示出来即可。如果彩色图像,则需要先转成为灰度图像。
详细代码如下:
void Widget::ShowImage()
{
QString strImageFile = QFileDialog::getOpenFileName(0,"Open","/home",tr("Images(*.png *jpg)"));
if(strImageFile.isEmpty())
return;
QImage image(strImageFile);
if(!image.allGray())
{
//change to grayImage
// qDebug() << image.bits();
image = image.convertToFormat(QImage::Format_Grayscale8);
}
if(image)
{
int nWidth = image.width();
int nHeight = image.height();
QVector<double> vecX;
QVector<double> vecY(256,0); //init Y data with 0;
int i = 0;
while (256 != i) {
vecX.append(i);
++i;
}
for(int j = 0; j < nHeight; j++)
{
for(int k = 0; k < nWidth; k ++)
{
int nIndex = int(image.bits()[j*nHeight + k]);
vecY[nIndex] = vecY.at(nIndex) + 1;
}
}
double yMax = 0;
for(int j = 0; j < 256 ; j++)
{
if(yMax < vecY.at(j))
yMax = vecY.at(j);
}
m_pChart->yAxis->setRange(0,yMax);
m_pChart->graph(0)->setData(vecX,vecY);
// m_pChart->graph(0)->setPen(QPen(Qt::red));
m_pChart->replot();
// qDebug() << "gray:" << image.bits();
image.scaled(800,600,Qt::AspectRatioMode::KeepAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(image));
ui->label->resize(image.width(),image.height());
}
}demo的完整代码如下链接。如上仅仅是个人的一点点心得,错误的地方欢迎大家不吝赐教。
https://download.csdn.net/download/xiaosha00000/10557845
tips:代码有个错误的地方,资源因为不能自己删除,就没改。资源widget.cpp的第49,50行,应该是image.width()和image.height()。不知道哪根筋搭错了,写错了。