heic(HEIF)格式图像处理(五)--图像灰度处理

什么是灰度图像

灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。

灰度图像解释

一幅完整的图像,是由红色、绿色、蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示“ 红,绿,蓝”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是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设置图像像素点色彩即可,别忘记保存图像。

效果图献上!

你可能感兴趣的:(Qt,.heic格式图像处理教程,C++)