无法在函数adaptiveThreshold中使用adaptiveThreshold:CV_8UC1

Phu*_*ang 26 python opencv

我使用过openCV python并遇到错误.

img_blur = cv2.medianBlur(self.cropped_img,5)
img_thresh_Gaussian = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

plt.subplot(1,1,1),plt.imshow(img_thresh_Gaussian, cmap = 'gray')
plt.title("Image"), plt.xticks([]), plt.yticks([])
plt.show()
Run Code Online (Sandbox Code Playgroud)

但我收到了:

cv2.error: /home/phuong/opencv_src/opencv/modules/imgproc/src/thresh.cpp:1280: error: (-215) src.type() == CV_8UC1 in function adaptiveThreshold
Run Code Online (Sandbox Code Playgroud)

我必须安装其他东西吗?

Sal*_*ali 92

问题是您正在尝试对不是灰度的图像使用自适应阈值处理.该功能仅适用于灰度图像.

因此,您必须将图像转换为灰度格式,如文档中所述.

他们用灰度格式读取图像:img = cv2.imread('dave.jpg',0).您还可以使用以下命令将其转换为灰度:img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  • 优秀.我会随时对代码进行正确的解释...... (5认同)
  • 我建议使用命名常量“ cv2.IMREAD_GRAYSCALE”而不是文字“ 0”作为“ imread”的第二个参数。它们是相等的,但是使用常数会更多地自我记录。 (3认同)

sam*_*sam 13

你应该像这样加载你的文件

src.create(rows, cols, CV_8UC1);
src = imread(your-file, CV_8UC1);
Run Code Online (Sandbox Code Playgroud)

在那之后

adaptiveThreshold(src, dst, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 75, 10);
Run Code Online (Sandbox Code Playgroud)

  • 什么是``src````type`` (9认同)
  • -1; 这只是巧合.[`imread` docs](https://docs.opencv.org/master/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56)规定传递给`imread`的`flags`应该是[`ImreadModes`](https: //docs.opencv.org/master/d4/da8/group__imgcodecs.html#ga61d9b0126a3e57d9277ac48327799c80) - 以`IMREAD_`开头的常量.你传递的标志`CV_8UC1`不是这样的常量,将它用作`imread()`标志并不是特别有意义 - 但它恰好起作用,因为`CV_8UC1`和`IMREAD_GRAYSCALE`都被定义为` 0`. (3认同)

Vai*_*v K 11

您可以将代码更改为稍微像这样:

img_blur = cv2.medianBlur(self.cropped_img,5).astype('uint8')
img_thresh_Gaussian = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
Run Code Online (Sandbox Code Playgroud)

只需添加 ('uint8') 而模糊就解决了我的问题。


小智 5

您必须以灰度图像读取图像,因此请使用以下代码:

image = imread('address', 0)
Run Code Online (Sandbox Code Playgroud)

0 将图像通道交换为灰度