【OpenCV + VS】图像像素的加减乘除操作

在图像处理中,我们常常需要对图像的像素值进行数学运算(加、减、乘、除),这些操作可以用于图像增强、特征提取、图像滤波等任务。理解如何对图像像素进行加减乘除操作,对于学习和实现图像处理算法非常重要。

一、为什么要对图像的像素进行加减乘除?

图像处理的很多应用需要调整图像的亮度、对比度、颜色等属性,或者实现一些特定的效果。对图像像素进行加减乘除运算,可以实现以下功能:

亮度调整:通过加减操作来调节图像的整体亮度。例如,增加所有像素的值可以让图像变亮,减少像素值会让图像变暗。

对比度调整:通过乘法操作来放大或缩小像素的差异,从而调整图像的对比度。

图像增强:对图像进行数学变换,使得图像的某些特征更加突出,例如通过加权平均、色调调整等方式增强图像的细节。

图像融合与组合:图像的加法和减法可以用于图像融合(例如合成两幅图像),而除法和乘法操作则可以用于特定的图像分割和滤波任务。

颜色处理:对于彩色图像(如RGB或BGR图像),通过对不同通道的像素进行加减乘除操作,可以实现颜色变换、滤色效果等。

二、图像像素加减乘除操作的基本原理

在OpenCV中,图像像素通常是以
Mat
类型存储的,像素值存储在一个二维数组中。对于彩色图像(BGR格式),每个像素包含三个值:蓝色、绿色和红色(BGR)的强度。

1. 加法(亮度增强)

通过对所有像素的值进行加法操作,可以提升图像的亮度。对图像进行加法操作时,通常会对每个通道的像素值加一个常数。

加法操作示例:提高图像的亮度



#include<opencv2/opencv.hpp>
#include <string.h>
using namespace cv;
const std::string picpath = "C:\Users\ZZM\Pictures\豆绘AI_3711794.jpg";
 
int main() {
	// 读取图像
	Mat image = imread(picpath);
 
	if (image.empty()) {
		std::cout << "Image not loaded!" << std::endl;
		return -1;
	}
 
	// 增加所有像素的亮度(加法操作)
	Mat bright_image = image + Scalar(50, 50, 50);  // 对BGR每个通道加50
 
	namedWindow("【1】Pic", WINDOW_NORMAL);
	resizeWindow("【1】Pic", image.cols, image.rows);
	// 显示图像
	imshow("【1】Pic", image);
 
	namedWindow("【2】Pic", WINDOW_NORMAL);
	resizeWindow("【2】Pic", bright_image.cols, bright_image.rows);
	// 显示图像
	imshow("【2】Pic", bright_image);
	waitKey(0);
 
	return 0;
}
 

在此示例中,
Scalar(50, 50, 50)
代表对每个像素的蓝色、绿色和红色通道分别加上50,从而提升图像的整体亮度。

【OpenCV + VS】图像像素的加减乘除操作

2. 减法(亮度降低)

减法操作可以用来降低图像的亮度或移除某些细节。例如,减少像素值会使图像变暗。

减法操作示例:减少图像的亮度



Mat dark_image = image - Scalar(50, 50, 50);  // 对BGR每个通道减去50
imshow("Darkened Image", dark_image);

减法操作通常用于降低亮度或者去除一些噪声或细节。

【OpenCV + VS】图像像素的加减乘除操作

3. 乘法(对比度调整)

通过乘法操作,可以对图像进行对比度增强。通过增加像素值之间的差异,图像的对比度变得更加明显。

乘法操作示例:增强图像对比度



#include<opencv2/opencv.hpp>
#include <string.h>
using namespace cv;
const std::string picpath = "C:\Users\ZZM\Pictures\豆绘AI_3711794.jpg";
 
int main() {
	// 读取图像
	Mat image = imread(picpath);
 
	if (image.empty()) {
		std::cout << "Image not loaded!" << std::endl;
		return -1;
	}
 
	Mat high_contrast_image;
	image.convertTo(high_contrast_image, -1, 1.5, 0);  // 增强对比度(乘法操作)
 
	namedWindow("High Contrast Image", WINDOW_NORMAL);
	resizeWindow("High Contrast Image", image.cols, image.rows);
	imshow("High Contrast Image", high_contrast_image);
	waitKey(0);
 
	return 0;
}
 


convertTo
函数的第二个参数
1.5
是乘数,它放大了每个像素的差异,增强了对比度。

【OpenCV + VS】图像像素的加减乘除操作

4. 除法(归一化或标准化)

除法操作可以用来对图像进行归一化处理,尤其在图像分割、滤波或图像增强中非常有用。

除法操作示例:降低对比度(或者对图像进行标准化处理)



#include<opencv2/opencv.hpp>
#include <string.h>
using namespace cv;
const std::string picpath = "C:\Users\ZZM\Pictures\豆绘AI_3711794.jpg";
 
int main() {
	// 读取图像
	Mat image = imread(picpath);
 
	if (image.empty()) {
		std::cout << "Image not loaded!" << std::endl;
		return -1;
	}
 
	Mat low_contrast_image;
	image.convertTo(low_contrast_image, -1, 0.5, 0);  // 减少对比度(除法操作)
 
	namedWindow("Low Contrast Image", WINDOW_NORMAL);
	resizeWindow("Low Contrast Image", image.cols, image.rows);
	imshow("Low Contrast Image", low_contrast_image);
	waitKey(0);
 
	return 0;
}
 

通过对图像像素进行除法处理,我们减小了像素之间的差异,从而降低了对比度。

【OpenCV + VS】图像像素的加减乘除操作

三、像素加减乘除的实际应用场景

调整图像亮度和对比度

通过加法和减法可以增加或减少图像的亮度。

通过乘法和除法可以增强或降低图像的对比度。

图像叠加与融合

通过加法操作可以将两幅图像叠加或融合,例如图像合成中的透明度控制。

通过减法操作可以提取不同图层之间的差异(例如背景与前景的分离)。

色调调整和滤色

对不同的颜色通道(BGR通道)进行加减乘除,可以调整图像的色调或进行滤色操作。

图像标准化

在某些图像处理任务中(如特征提取和机器学习应用),需要将图像像素值标准化到一定的范围(如[0, 1]),这时就需要使用除法。

四、总结

对图像像素进行加减乘除操作是图像处理中的基础操作之一。通过这些操作,我们可以实现图像的亮度调整、对比度增强、图像叠加等各种效果。理解这些基本操作是进一步学习和实现更复杂图像处理算法的前提。

加法:用于亮度增强或亮度调整。

减法:用于降低亮度或去除某些细节。

乘法:用于增强对比度或放大像素值差异。

除法:用于标准化图像或降低对比度。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...