cv2.convertScaleAbs增强亮度对比度的原理
时间: 2024-05-02 22:17:38 浏览: 328
`cv2.convertScaleAbs` 是 OpenCV 提供的一种图像处理函数,用于对图像进行亮度和对比度的增强。它的原理非常简单,它将输入图像的每个像素值乘以一个缩放因子,然后加上一个偏移量,以达到亮度和对比度的调整。
具体来说,`cv2.convertScaleAbs` 的公式如下:
```
dst = cv2.convertScaleAbs(src, alpha=alpha, beta=beta)
```
其中,`src` 表示输入图像,`alpha` 表示缩放因子,`beta` 表示偏移量,`dst` 表示输出图像。
具体地,`cv2.convertScaleAbs` 的处理过程如下:
1. 对于每个像素点 $p$,将它的像素值 $I_{p}$ 乘以一个缩放因子 $\alpha$,即:$I'_{p} = \alpha \cdot I_{p}$。
2. 然后加上一个偏移量 $\beta$,即:$I''_{p} = I'_{p} + \beta$。
3. 如果 $I''_{p}$ 的值小于0,则将它截断为0;如果 $I''_{p}$ 的值大于255,则将它截断为255。
4. 最后,将 $I''_{p}$ 转换为整数类型(取绝对值并截断),即:$I_{p} = |I''_{p}|$。
这样,就完成了对图像的亮度和对比度的调整。通过调节缩放因子和偏移量,可以实现不同程度的增强效果。
相关问题
def enhance_gray(image, alpha=1.2, beta=30): enhanced_image = cv2.convertScaleAbs(image, alpha=alpha, beta=beta) return enhanced_image 代码解析
这段代码使用了OpenCV中的convertScaleAbs函数实现了灰度图像的增强。下面是对代码的解析:
```python
def enhance_gray(image, alpha=1.2, beta=30):
# 使用convertScaleAbs函数进行灰度图像的增强
enhanced_image = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
# 返回增强后的图像
return enhanced_image
```
其中,函数的参数为:
- `image`:需要进行增强的灰度图像;
- `alpha`:调整对比度的参数,默认值为1.2;
- `beta`:调整亮度的参数,默认值为30。
函数先使用convertScaleAbs函数对输入的灰度图像进行增强,然后返回增强后的图像。
convertScaleAbs函数的作用是将像素值进行缩放和平移,从而调整图像的对比度和亮度。具体来说,对于像素值为$x$的像素,函数将其转换为:
$y = \alpha x + \beta$
其中,$\alpha$和$\beta$分别为函数的两个参数。这个公式同时对于灰度图像和彩色图像都适用,但需要注意的是,彩色图像需要分别对三个通道进行增强。
总的来说,这段代码实现了简单的灰度图像增强,可以根据实际需求调整参数来得到更好的效果。
请帮我写一段二维码矫正的代码,要求如下:1.对比度亮度调整;2.滤波降噪3.反二值化4.腐蚀膨胀处理5.Canny边缘检测6.Hough算子拟合直线7.计算二维码四个顶点坐标8.利用顶点坐标进行仿射变换
好的,以下是代码:
```
import cv2
# 读入图片
img = cv2.imread('qrcode.jpg', cv2.IMREAD_GRAYSCALE)
# 对比度、亮度调整
img = cv2.convertScaleAbs(img, alpha=1.2, beta=10)
# 滤波降噪
img = cv2.GaussianBlur(img, (3, 3), 0)
# 反二值化
img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# 腐蚀膨胀处理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# Canny边缘检测
edges = cv2.Canny(img, 100, 200)
# Hough算子拟合直线
lines = cv2.HoughLinesP(edges, 1, cv2.cv.CV_PI / 180, 50, minLineLength=50, maxLineGap=10)
# 计算二维码四个顶点坐标
x1, x2, y1, y2 = 0, 0, 0, 0
for line in lines:
x1, y1, x2, y2 = line[0]
k = abs(y2 - y1) / abs(x2 - x1)
if k > 0.5:
break
x1, x2, y1, y2 = min(x1, x2), max(x1, x2), min(y1, y2), max(y1, y2)
p1 = (x1, y1)
p2 = (x2, y1)
p3 = (x2, y2)
p4 = (x1, y2)
# 利用顶点坐标进行仿射变换
pts1 = [p1, p2, p3, p4]
pts2 = [(100, 100), (300, 100), (300, 300), (100, 300)]
M = cv2.getPerspectiveTransform(pts1, pts2)
img = cv2.warpPerspective(img, M, (400, 400))
# 显示结果图片
cv2.imshow('result', img)
cv2.waitKey(0)
```
阅读全文