鱼C论坛

 找回密码
 立即注册
查看: 783|回复: 4

边缘检测报错,请帮忙说明原因,或重新修改代码,谢谢。

[复制链接]
发表于 2023-8-6 14:41:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请大家帮忙写出正确的代码,谢谢
代码:
from tifffile import imread
import numpy as np
from osgeo import gdal, osr
import cv2
# 读取TIFF格式无人机影像数据
image_path = 'F:\duneline\dune\dune.tif'
output_path = 'overlay_image.tif'

image = imread(image_path)

# 将输入图像转换为灰度图像
gray_image = np.mean(image, axis=2)

# 自适应阈值二值化
binary = np.zeros_like(gray_image, dtype=np.uint8)
window_size = 7 # 窗口大小
k = 0.1 # 控制阈值的参数
for i in range(window_size//2, gray_image.shape[0]-window_size//2):
    for j in range(window_size//2, gray_image.shape[1]-window_size//2):
        window = gray_image[i-window_size//2:i+window_size//2+1, j-window_size//2:j+window_size//2+1]
        threshold = np.mean(window) - k * np.std(window)
        if gray_image[i, j] > threshold:
            binary[i, j] = 255

# 使用Canny边缘检测
edges = cv2.Canny(gray_image, 30, 100)
# 对边缘图像应用形态学操作
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilated_edges = cv2.dilate(edges, kernel, iterations=1)
closing = cv2.morphologyEx(dilated_edges, cv2.MORPH_CLOSE, kernel, iterations=3)

# 配置输出的空间参考信息
in_ds = gdal.Open(image_path)
projection = in_ds.GetProjection()
geotransform = in_ds.GetGeoTransform()

# 创建新的输出图像
driver = gdal.GetDriverByName('GTiff')
out_ds = driver.Create(output_path, image.shape[1], image.shape[0], 1, gdal.GDT_Byte,  options=['COMPRESS=NONE'])  # 修改数据类型为gdal.GDT_Byte

# 设置输出图像的空间参考信息
out_ds.SetProjection(projection)
out_ds.SetGeoTransform(geotransform)

# 将沙脊线部分写入输出图像
out_band = out_ds.GetRasterBand(1)
out_band.WriteArray(closing)  # 修改为正确的数据类型

# 设置颜色表
color_table = gdal.ColorTable()
color_table.SetColorEntry(0, (0, 0, 0, 0))  # 黑色,对应值为0
color_table.SetColorEntry(255, (255, 255, 255, 255))  # 白色,对应值为255
out_band.SetColorTable(color_table)

# 释放资源
out_band.FlushCache()
out_ds = None
in_ds = None

print("保存成功!")

报错:
Traceback (most recent call last):
  File "F:/duneline/duneline.py", line 253, in <module>
    edges = cv2.Canny(gray_image, 30, 100)
cv2.error: OpenCV(3.4.10) C:\projects\opencv-python\opencv\modules\imgproc\src\canny.cpp:829: error: (-215:Assertion failed) _src.depth() == CV_8U in function 'cv::Canny'


Process finished with exit code 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-6 14:41:29 | 显示全部楼层
错误提示中指出了问题所在:在调用cv2.Canny函数时,输入图像的数据类型不符合要求,需要将其转换为CV_8U类型。

可以将以下代码段:
# 将输入图像转换为灰度图像gray_image = np.mean(image, axis=2)
修改为:
# 将输入图像转换为灰度图像并转换数据类型gray_image = np.mean(image, axis=2).astype(np.uint8)
这样就会将灰度图像的数据类型转换为np.uint8,符合cv2.Canny函数的要求。

如果回答对你有帮助,请给我一个最佳答案!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-6 14:41:30 | 显示全部楼层
报错信息显示在调用cv2.Canny函数时出现了错误,具体是因为输入图像的数据类型不正确。cv2.Canny函数要求输入的图像数据类型是CV_8U,即8位无符号整数。而在代码中,gray_image是通过np.mean函数计算得到的,数据类型可能是浮点型。因此,需要将gray_image转换为无符号8位整数类型。可以使用cv2.convertScaleAbs函数将其转换为CV_8U类型。修改代码如下:
# 将输入图像转换为灰度图像
gray_image = np.mean(image, axis=2).astype(np.uint8)

修改后,重新运行代码,应该就不会再报错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-6 14:41:49 | 显示全部楼层
问题出在将输入图像转换为灰度图像时,没有将数据类型从浮点型转换为无符号8位整型。导致后续的Canny边缘检测函数报错。

以下是修改后的代码:
from tifffile import imreadimport numpy as npfrom osgeo import gdal, osrimport cv2# 读取TIFF格式无人机影像数据image_path = 'F:\duneline\dune\dune.tif'output_path = 'overlay_image.tif'image = imread(image_path)# 将输入图像转换为灰度图像gray_image = np.mean(image, axis=2).astype(np.uint8)  # 转换数据类型为uint8# 自适应阈值二值化binary = np.zeros_like(gray_image, dtype=np.uint8)window_size = 7  # 窗口大小k = 0.1  # 控制阈值的参数for i in range(window_size//2, gray_image.shape[0]-window_size//2):    for j in range(window_size//2, gray_image.shape[1]-window_size//2):        window = gray_image[i-window_size//2:i+window_size//2+1, j-window_size//2:j+window_size//2+1]        threshold = np.mean(window) - k * np.std(window)        if gray_image[i, j] > threshold:            binary[i, j] = 255# 使用Canny边缘检测edges = cv2.Canny(gray_image, 30, 100)# 对边缘图像应用形态学操作kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))dilated_edges = cv2.dilate(edges, kernel, iterations=1)closing = cv2.morphologyEx(dilated_edges, cv2.MORPH_CLOSE, kernel, iterations=3)# 配置输出的空间参考信息in_ds = gdal.Open(image_path)projection = in_ds.GetProjection()geotransform = in_ds.GetGeoTransform()# 创建新的输出图像driver = gdal.GetDriverByName('GTiff')out_ds = driver.Create(output_path, image.shape[1], image.shape[0], 1, gdal.GDT_Byte, options=['COMPRESS=NONE'])  # 修改数据类型为gdal.GDT_Byte# 设置输出图像的空间参考信息out_ds.SetProjection(projection)out_ds.SetGeoTransform(geotransform)# 将沙脊线部分写入输出图像out_band = out_ds.GetRasterBand(1)out_band.WriteArray(closing.astype(np.uint8))  # 修改为正确的数据类型# 设置颜色表color_table = gdal.ColorTable()color_table.SetColorEntry(0, (0, 0, 0, 0))  # 黑色,对应值为0color_table.SetColorEntry(255, (255, 255, 255, 255))  # 白色,对应值为255out_band.SetColorTable(color_table)# 释放资源out_band.FlushCache()out_ds = Nonein_ds = Noneprint("保存成功!")
请尝试运行修改后的代码,看是否能够成功执行边缘检测并保存图像。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-7 08:09:55 | 显示全部楼层
您好,我很高兴能帮助您解决您的问题。

根据您的错误信息,我发现您的问题可能是由于您的输入图像的数据类型不是CV_8U,即8位无符号整数。Canny边缘检测函数要求输入图像的数据类型必须是CV_8U,否则会报错。

为了解决这个问题,您可以在调用Canny函数之前,将灰度图像转换为CV_8U类型,例如:
gray_image = np.mean(image, axis=2).astype(np.uint8) # 添加.astype(np.uint8)

这样就可以避免数据类型不匹配的错误。

希望这能对您有所帮助。如果您还有其他问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 01:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表