rows, cols = img.shape[:2] src_pts = np.float32([[0, 0], [cols-1, 0], [0, rows-1], [cols-1, rows-1]]) dst_pts = np.float32([[0, 0], [cols-1, 0], [cols*0.1, rows-1], [cols*0.9, rows-1]]) M = cv2.getPerspectiveTransform(src_pts, dst_pts) warped = cv2.warpPerspective(img, M, (cols, rows))经过扭曲矫正的图像边缘有一大片黑色怎么办怎么将黑色变白
时间: 2023-12-21 15:03:11 浏览: 111
可以使用 OpenCV 中的阈值处理函数 `cv2.threshold()` 来将黑色区域变成白色。首先将图像转换为灰度图像,然后应用阈值处理函数,将灰度值低于一定阈值的像素点设置为白色,其余的像素点设置为黑色。具体实现如下:
```python
gray = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY) # 将扭曲矫正后的图像转换为灰度图像
_, thresh = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY) # 应用阈值处理函数
```
其中,第二个参数为阈值,这里设置为 10,可以根据实际情况进行调整。处理后,`thresh` 为二值化图像,黑色区域变成了白色。
相关问题
在qgraphicsview中用此函数遍历多个点集for (auto it : m_pts) { /*int rect_x = it.x() - RECT_SIZE/4 ; int rect_y = it.y() - RECT_SIZE /4; cv::Rect rect(rect_x, rect_y, RECT_SIZE, RECT_SIZE); rect = rect & cv::Rect(0, 0, ImgBin.cols, ImgBin.rows); for (int nRow = rect_y - rect.height; nRow < rect_y + rect.height; nRow++) { for (int nCol = rect_x - rect.width; nCol < rect_x + rect.width; nCol++) {*/ ImgBin.row(it.y()).data[it.x()] = 255; }在超出图片的地方会进入断点
根据您提供的代码,可能是由于循环中的 rect 超出了图像的范围,导致在超出图片的地方进入了断点。
您可以在循环前加入判断,确保 rect 不会超出图像的范围。例如:
```cpp
for (auto it : m_pts) {
int rect_x = it.x() - RECT_SIZE / 4;
int rect_y = it.y() - RECT_SIZE / 4;
cv::Rect rect(rect_x, rect_y, RECT_SIZE, RECT_SIZE);
rect = rect & cv::Rect(0, 0, ImgBin.cols, ImgBin.rows);
for (int nRow = rect.y; nRow < rect.y + rect.height; nRow++) {
for (int nCol = rect.x; nCol < rect.x + rect.width; nCol++) {
ImgBin.row(nRow).data[nCol] = 255;
}
}
}
```
这里,使用 `cv::Rect` 的 `&` 运算符来确保 `rect` 不会超出图像的范围。同时,在循环中使用 `rect.x` 和 `rect.y` 作为起始值,确保不会越界。
# 透视变换复习 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('sudoku.jpg') rows,cols,ch = img.shape pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]]) M = cv2.getPerspectiveTransform(pts1,pts2) dst = cv2.warpPerspective(img,M,(300,300)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show() img = cv2.imread('road.png') cv2.circle(img, (270,160),2, (0,0,255),2) cv2.circle(img, (330,160),2, (0,0,255),2) cv2.circle(img, (32,260),2, (0,0,255),2) cv2.circle(img, (555,260),2, (0,0,255),2) cv2.imshow('draw', img) cv2.waitKey(0) import matplotlib.pyplot as plt rows,cols,ch = img.shape pts1 = np.float32([[270,160],[328,160],[32,260],[575,260]]) pts2 = np.float32([[20,0],[510,0],[20,103],[510,103]]) M = cv2.getPerspectiveTransform(pts1,pts2) dst = cv2.warpPerspective(img,M,(523,100)) dst = cv2.resize(dst, None, fx=0.5,fy=4.0) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show() 在每句代码后详细解释注释这段代码
```
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取一张图片
img = cv2.imread('sudoku.jpg')
# 获取图片的行、列、通道数
rows,cols,ch = img.shape
# 定义变换前后四个点的坐标
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
# 计算透视变换矩阵M
M = cv2.getPerspectiveTransform(pts1,pts2)
# 进行透视变换
dst = cv2.warpPerspective(img,M,(300,300))
# 显示原始图片和透视变换后的图片
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
# 读取另一张图片
img = cv2.imread('road.png')
# 在图片上标记四个点
cv2.circle(img, (270,160),2, (0,0,255),2)
cv2.circle(img, (330,160),2, (0,0,255),2)
cv2.circle(img, (32,260),2, (0,0,255),2)
cv2.circle(img, (555,260),2, (0,0,255),2)
# 显示标记后的图片
cv2.imshow('draw', img)
cv2.waitKey(0)
# 获取图片的行、列、通道数
rows,cols,ch = img.shape
# 定义变换前后四个点的坐标
pts1 = np.float32([[270,160],[328,160],[32,260],[575,260]])
pts2 = np.float32([[20,0],[510,0],[20,103],[510,103]])
# 计算透视变换矩阵M
M = cv2.getPerspectiveTransform(pts1,pts2)
# 进行透视变换
dst = cv2.warpPerspective(img,M,(523,100))
# 缩放变换后的图片
dst = cv2.resize(dst, None, fx=0.5,fy=4.0)
# 显示原始图片和透视变换后的图片
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
```
代码的详细解释如下:
1. 导入需要的库cv2、numpy和matplotlib.pyplot。
2. 读取一张图片(这里是sudoku.jpg)。
3. 获取图片的行、列、通道数。
4. 定义变换前后四个点的坐标(pts1和pts2),这些点用于计算透视变换矩阵M。在这个例子中,我们想要将数独图片的四个角变换为一个矩形,以便进行后续处理。
5. 使用cv2.getPerspectiveTransform()函数来计算透视变换矩阵M。
6. 使用cv2.warpPerspective()函数将原始图像img进行透视变换,并将变换后的图像保存为dst。
7. 使用plt.subplot()和plt.imshow()函数将原始图像和透视变换后的图像显示出来,以供观察和比较。
8. 读取另一张图片(这里是road.png)。
9. 在图片上标记四个点,以便后续计算透视变换矩阵。
10. 显示标记后的图片。
11. 再次获取图片的行、列、通道数。
12. 重新定义变换前后四个点的坐标,这些点用于计算透视变换矩阵M。在这个例子中,我们想要将道路的四个角变换为一个矩形,以便进行后续处理。
13. 使用cv2.getPerspectiveTransform()函数来计算透视变换矩阵M。
14. 使用cv2.warpPerspective()函数将原始图像img进行透视变换,并将变换后的图像保存为dst。
15. 使用cv2.resize()函数对变换后的图像进行缩放,以便更好地观察。
16. 使用plt.subplot()和plt.imshow()函数将原始图像和透视变换后的图像显示出来,以供观察和比较。
阅读全文