# Apply adaptive thresholding to create binary image with white areas representing potential crispers thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 5)
时间: 2024-04-03 09:31:45 浏览: 69
这段代码是使用OpenCV中的自适应阈值法对灰度图像进行二值化处理,得到的二值图像会被赋值给变量thresh。其中,ADAPTIVE_THRESH_MEAN_C表示使用局部均值法计算阈值,11指定了每个像素点周围用来计算阈值的像素点的大小,5指定了阈值的偏移量,cv2.THRESH_BINARY_INV则表示将图像进行反转,即将亮度值高的像素点变成黑色,亮度值低的像素点变成白色。
通过自适应阈值法,可以根据图像的局部特点,自动调整阈值,从而更好地保留图像中的细节信息,避免过度二值化。
相关问题
images= glob.glob('./image/*.jpg') # print(images) for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Find the chess board corners # If desired number of corners are found in the image then ret = true ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE) """ If desired number of corner are detected, we refine the pixel coordinates and display them on the images of checker board """ if ret == True: objpoints.append(objp) # refining pixel coordinates for given 2d points. corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) imgpoints.append(corners2) # Draw and display the corners img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret) # cv2.imshow('img',img) # cv2.waitKey(0) cv2.destroyAllWindows() # h, w = np.array(img).shape[:2] h, w = img.shape[:2] """ Performing camera calibration by passing the value of known 3D points (objpoints) and corresponding pixel coordinates of the detected corners (imgpoints) """ ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) print("Camera matrix : \n") print(mtx) print("dist : \n") print(dist) print("rvecs : \n") print(rvecs) print("tvecs : \n") print(tvecs)这段代码有错误,请帮我找出来
这段代码存在一些错误,可能会导致出现你之前提到的错误。我列出了一些可能的问题:
1. 代码中没有定义CHECKERBOARD变量,需要在代码中加入如下语句定义CHECKERBOARD:
CHECKERBOARD = (6, 9)
2. 代码中没有定义objp变量,需要在代码中加入如下语句定义objp:
objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0, :, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
3. 可能存在一些图像无法找到所有的角点,导致ret为False。可以在代码中加入如下语句,跳过这些无法找到所有角点的图像:
if ret == False:
continue
4. 在调用calibrateCamera函数时,输入的第三个参数应该是图像的大小,而不是灰度图像的大小。可以将代码中的gray.shape[::-1]修改为img.shape[:2]。
修改后的代码如下所示:
```python
import numpy as np
import cv2
import glob
CHECKERBOARD = (6, 9)
objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0, :, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
objpoints = []
imgpoints = []
images = glob.glob('./image/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH +
cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)
if ret == True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
imgpoints.append(corners2)
img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)
h, w = img.shape[:2]
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, (w, h), None, None)
print("Camera matrix : \n")
print(mtx)
print("dist : \n")
print(dist)
print("rvecs : \n")
print(rvecs)
print("tvecs : \n")
print(tvecs)
```
希望以上修改可以帮到你,如果还有其他问题,可以随时问我。
import cv2 import numpy as np import matplotlib.pyplot as plt gray = cv2.imread('digits.png', 0) digits = [np.hsplit(r, 100) for r in np.vsplit(gray, 50)] # 分解数字:50行,100列 np_digits = np.array(digits) # 转换为numpy数组 # 准备训练数据,转换为二维数组,每个图像400个像素 train_data = np_digits.reshape(-1, 400).astype(np.float32) train_labels = np.repeat(np.arange(10), 500)[:, np.newaxis] # 定义标志 knn = cv2.ml.KNearest_create() # 创建kNN分类器 knn.train(train_data, cv2.ml.ROW_SAMPLE, train_labels) # 训练模型 # 用绘图工具创建手写数字5图像(大小20x20)进行测试(黑白二值图像) test = cv2.imread('d5.png', 0) # 打开测试图像 test = cv2.resize(test, (20, 20)) # 转换为20x20大小 test_data = test.reshape(1, 400).astype(np.float32) # 转换为测试数据 ret, result, neighbours, dist = knn.findNearest(test_data, k=3) # 执行测试 print(result.ravel()) print(neighbours.ravel()) # 拍摄图像数字3,进行测试(非黑白二值图像) img2 = cv2.imread('d3.png', 0) img2 = cv2.resize(img2, (20, 20)) ret, img2 = cv2.threshold(img2, 150, 255, cv2.THRESH_BINARY_INV) # 反二值化阈值处理 test_data = img2.reshape(1, 400).astype(np.float32) # 转换为测试数据 ret, result, neighbours, dist = knn.findNearest(test_data, k=3) # 执行测试 print(result.ravel()) print(neighbours.ravel()) 以上代码怎么优化
下面是对代码的一些优化建议:
1. 使用 with 语句打开文件:在读取图片时,最好使用 with 语句打开文件,这样可以确保文件在使用后被正确关闭,也可以避免一些意外情况下的错误。
2. 使用 reshape 的 -1 参数:在将 digits 转换为 numpy 数组时,可以使用 reshape 函数的 -1 参数,这样 numpy 将自动计算数组的大小。
3. 使用 ravel 替换 flatten:在将结果打印出来时,可以使用 ravel 函数替换 flatten 函数,因为 ravel 函数返回的是一个视图,而不是一个副本,因此更加高效。
4. 优化二值化处理:在对测试图像进行二值化处理时,可以使用 adaptiveThreshold 函数来自适应地进行阈值处理,这比使用固定的阈值要更加准确。
5. 使用 plt.imshow 显示图像:在显示图像时,可以使用 plt.imshow 函数,这样可以更加方便地进行调整和处理。
6. 添加注释:在代码中添加注释,可以帮助其他人更好地理解代码的含义和作用。
下面是优化后的代码:
```
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 打开文件并读取灰度图像
with open('digits.png', 'rb') as f:
gray = cv2.imdecode(np.frombuffer(f.read(), np.uint8), cv2.IMREAD_GRAYSCALE)
# 分解数字:50行,100列
digits = np.hsplit(np.vstack(np.hsplit(gray, 100)), 50)
# 转换为numpy数组
np_digits = np.array(digits)
# 转换为二维数组,每个图像400个像素
train_data = np_digits.reshape(-1, 400).astype(np.float32)
# 定义标志
train_labels = np.repeat(np.arange(10), 500)[:, np.newaxis]
# 创建kNN分类器
knn = cv2.ml.KNearest_create()
# 训练模型
knn.train(train_data, cv2.ml.ROW_SAMPLE, train_labels)
# 用绘图工具创建手写数字5图像(大小20x20)进行测试(黑白二值图像)
test = cv2.imread('d5.png', cv2.IMREAD_GRAYSCALE)
# 转换为20x20大小
test = cv2.resize(test, (20, 20))
# 自适应阈值二值化处理
test = cv2.adaptiveThreshold(test, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)
# 转换为测试数据
test_data = test.reshape(1, 400).astype(np.float32)
# 执行测试
ret, result, neighbours, dist = knn.findNearest(test_data, k=3)
# 打印测试结果
print(result.ravel())
print(neighbours.ravel())
# 拍摄图像数字3,进行测试(非黑白二值图像)
img2 = cv2.imread('d3.png', cv2.IMREAD_GRAYSCALE)
# 转换为20x20大小
img2 = cv2.resize(img2, (20, 20))
# 自适应阈值二值化处理
img2 = cv2.adaptiveThreshold(img2, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)
# 转换为测试数据
test_data = img2.reshape(1, 400).astype(np.float32)
# 执行测试
ret, result, neighbours, dist = knn.findNearest(test_data, k=3)
# 打印测试结果
print(result.ravel())
print(neighbours.ravel())
# 显示测试图像
plt.imshow(test, cmap='gray')
plt.show()
# 显示训练图像
plt.imshow(gray, cmap='gray')
plt.show()
```
阅读全文