灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。
一幅完整的图像,是由红色、绿色、蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示“ 红,绿,蓝”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。
通道是整个Photoshop显示图像的基础。色彩的变动,实际上就是间接在对通道灰度图进行调整。通道是Photoshop处理图像的核心部分,所有的色彩调整工具都是围绕在这个核心周围使用的。
在计算机领域中,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。
我们可以通过下面几种方法,将其转换为灰度:
1.浮点算法:Gray=R*0.3+G*0.59+B*0.11
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。
知道了什么是灰度图像和转换方法后,我们来试试看:
QAction *pgreyScale = new QAction(QStringLiteral("灰度(&H)"));
connect(pgreyScale, &QAction::triggered, this, &heicExample::greyScale);
pMenu2->addAction(pgreyScale);
首先我们创建一个菜单按钮,并绑定槽函数。
void heicExample::greyScale()
{
QImage newImage(image.width(), image.height(), QImage::Format_ARGB32);
QColor oldColor;
for (int x = 0; x < newImage.width(); x++) {
for (int y = 0; y < newImage.height(); y++) {
oldColor = QColor(image.pixel(x, y));
//QColor *pcolor = new QColor(oldColor.red(),oldColor.green(),oldColor.blue());
int average = (oldColor.red() + oldColor.green() + oldColor.blue()) / 3;
newImage.setPixel(x, y, qRgb(average, average, average));
}
}
if (pixItem)
{
m_graphicsScene->removeItem(pixItem); //将上一个图元从场景中移除,重新添加新的图元
delete pixItem;
pixItem = NULL;
}
image_save = newImage.copy();
pixItem = new PixItem(QPixmap::fromImage(newImage));
//将该图元对象添加到场景中,并设置此图元在场景中的位置为中心(0,0)
m_graphicsScene->addItem(pixItem);
pixItem->setPos(0, 0);
}
上述代码主要使用了平均值法进行转换的,先获取图像的每个像素点的RGB颜色,然后对RGB的值取平均数,最后通过函数setPixel设置图像像素点色彩即可,别忘记保存图像。
效果图献上!