五:OpenCV图像变换与增强一(C++/python)

业务图片处理中经常会对图片样式效果做变换和增强,在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;
}

效果图

函数各种值还是要自己手动尝试下记忆比较深刻

更多推荐>>

四:OpenCV图片复制函数(C++/python)

三:OpenCV图片颜色通道数据转换

二:OpenCV图片叠加逻辑运算