业务图片处理中经常会对图片样式效果做变换和增强,在opencv中提供了多达9种方法可以直接使用,这里分开2篇文章展开说明,第一部分本文涉及函数包括:
1.convertScaleAbs
2.log
3.exp
4.pow
1.函数convertScaleAbs (图像线性变换)
定义:
void convertScaleAbs(InputArray src, OutputArray dst, double alpha = 1, double beta = 0); --c++函数
def convertScaleAbs(src, dst=None, alpha=None, beta=None) --python 函数
参数:
src:输入的多通道图像
dst:输出指定通道图像
alpha:缩放因子 (该值越大亮部越亮,暗部越暗)
beta:偏移值(该值越大图片整体亮度越高)
作用:将图像转为8位无符号图像,同时可以实现线性变换的功能,alpha表示线性变换的比例因子,beta表示线性变换的偏移值。
使用案例
#python code _localimg=cv2.imread("xxx.jpg") convertScaleAbsImage = cv2.convertScaleAbs(_localimg,2,19) plt.figure("convertScaleAbsImage") plt.title("convertScaleAbsImage") plt.imshow(convertScaleAbsImage) plt.show() #c++ code #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("xxx.jpg", 0); Mat dst; convertScaleAbs(src, dst , 2, 19); namedWindow("src", 0); imshow("src", src); namedWindow("dst", 0); imshow("dst", dst); waitKey(0); return 0; }
效果
2.函数log (将原图像进行对数变换)
定义:
void log(InputArray src, OutputArray dst);
def log(src, dst=None);
参数:
src:输入图像
dst:输出图像
作用:将图像进行对数变换,注意在使用该函数之前,通常先将原图像每个像素值加“1”,这样可以避免像素值为“0”的在对数变换之后出现错误,此外,对数变换之后的数据类型为浮点型或双精度型,如果需要显示变换之后的图像,需要用到convertScaleAbs函数将其转巍峨8位无符号数,如果有必要,还可能进行归一化操作将像素值变换到[0,255]区间。
(通俗点说就是将图片整体亮度提升,对局部过亮有抑制作用,个人感觉比convertScaleAbs的整体提升要亮一些)
使用案例
#python code img=cv2.imread(xxx.jpg) logImage = cv2.log(img) plt.figure("logImage") plt.title("logImage") plt.imshow(logImage) plt.show() #C++ code #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("xxx.jpg", 0); Mat convertToMat; log(src, convertToMat); namedWindow("convertToMat", 0); imshow("convertToMat", convertToMat); waitKey(0); return 0; }
效果图
3.函数 exp (将图像进行指数变换)
定义:
void exp(InputArray src, OutputArray dst); --c++函数
def exp(src, dst=None) -- python函数
参数:
src:输入图像
dst:输出图像
作用:将图像进行指数变换,变换之后的数据类型为浮点型或双精度型,如果需要显示变换之后的图像,需要用到convertScaleAbs函数将其转为8位无符号数,如果有必要,还可能进行归一化操作将像素值变换到[0,255]区间。
(个人感觉该函数适用于过曝区域的识别,或不同区域的区分)
使用案例
#python code _localimg=cv2.imread("xxx.jpg") convertScaleAbsImage = cv2.convertScaleAbs(_localimg,2,19) convertScaleAbsImage = np.float32(convertScaleAbsImage) expImage = cv2.exp(ConvertScaleAbsImage) plt.figure("expImage") plt.title("expImage") plt.imshow(expImage) plt.show() #C++ code #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("2.png", 0); Mat dst; Sobel(src, dst, CV_32F, 1, 0, 3); #转换到32位 exp(dst, dst); namedWindow("src", 0); imshow("src", src); namedWindow("dst", 0); imshow("dst", dst); waitKey(0); return 0; }
效果图
4.函数 pow (将图像进行幂变换)
定义:
void pow(InputArray src, double power, OutputArray dst); --c++函数
def pow(src, power, dst=None) --python函数
参数:
src:输入图像
power:幂
dst:输出图像
作用:将图像进行幂变换,变换之后的数据类型为浮点型或双精度型,如果需要显示变换之后的图像,需要用到convertScaleAbs函数将其转为8位无符号数,如果有必要,还可能进行归一化操作将像素值变换到[0,255]区间。
(主要作用是提高对比度,将暗部变得更暗)
使用案例
#python code _localimg=cv2.imread("xxx.jpg") Mat powImage; pow(_localimg,powImage); plt.figure("powImage") plt.title("powImage") plt.imshow(powImage) plt.show() #C++ code #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("xxx.jpg", 0); Mat dst; Mat convertToMat; src.convertTo(convertToMat, CV_32F); pow(convertToMat, 1.2, dst); namedWindow("dst", 0); imshow("dst", dst); waitKey(0); return 0; }
效果图
函数各种值还是要自己手动尝试下记忆比较深刻
更多推荐>>