Justheartyoung 发表于 2023-8-8 14:53:09

请帮忙解决报错问题,给出正确代码。

代码:
from tifffile import imread, imwrite
from skimage import filters, feature, color, morphology
import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage
import cv2
from skimage.filters import threshold_otsu
# 1. 分割遥感影像为多块图幅
def split_image(image, num_rows, num_cols):
    height, width = image.shape[:2]
    row_height = height // num_rows
    col_width = width // num_cols
    images = []
    for r in range(num_rows):
      for c in range(num_cols):
            start_row = r * row_height
            end_row = start_row + row_height
            start_col = c * col_width
            end_col = start_col + col_width
            sub_image = image
            images.append(sub_image)
    return images

#2. 分别对每块图幅转为灰度图像,并应用直方图均衡化
def convert_to_grayscale(images):
    grayscale_images = []
    for image in images:
      gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
      enhanced_image = cv2.equalizeHist(gray_image)# 直方图均衡化增强对比度
      grayscale_images.append(enhanced_image)
    return grayscale_images

#3.检测目标地物

def edge_detection(images):
    edges = []
    for image in images:
      # 使用新的边缘检测方法
      edges_image = filters.roberts(image)

      # 计算全局阈值
      threshold = threshold_otsu(edges_image)
      # 进行二值化处理
      binary = edges_image > threshold
      edges.append(binary)
    return edges

# 4. 消除噪声干扰
def denoise(images):
    denoised_images = []
    for image in images:
      # 使用其他滤波方法,这里以高斯滤波为例
      denoised_image = cv2.GaussianBlur(image, (5, 5), 0)
      denoised_images.append(denoised_image)
    return denoised_images
# 5. 将各个图幅合并为一个图幅
def merge_images(images, num_rows, num_cols):
    row_height, col_width = images.shape[:2]
    merged_image = np.zeros((row_height * num_rows, col_width * num_cols), dtype=np.uint8)
    i = 0
    for r in range(num_rows):
      for c in range(num_cols):
            start_row = r * row_height
            end_row = start_row + row_height
            start_col = c * col_width
            end_col = start_col + col_width
            merged_image = images
            i += 1
    return merged_image
# 6. 导出结果
def export_result(image, filename):
    cv2.imwrite(filename, image)
# 加载遥感影像
image = imread(r"F:\duneline\dune\dune.tif")
# 1. 分割遥感影像为多块图幅
num_rows = 3
num_cols = 7
sub_images = split_image(image, num_rows, num_cols)
# 2. 分别对每块图幅转为灰度图像
gray_images = convert_to_grayscale(sub_images)
# 3. 使用其他边缘检测方法代替Canny算法
edges = edge_detection(gray_images)
# 4. 消除噪声干扰
denoised_edges = denoise(edges)
# 5. 将各个图幅合并为一个图幅
merged_image = merge_images(denoised_edges, num_rows, num_cols)
# 6. 导出结果
export_result(merged_image, 'path_to_output1.jpg')

报错内容:
Traceback (most recent call last):
File "F:/duneline/sobel.py", line 143, in <module>
    denoised_edges = denoise(edges)
File "F:/duneline/sobel.py", line 112, in denoise
    denoised_image = cv2.GaussianBlur(image, (5, 5), 0)
TypeError: Expected Ptr<cv::UMat> for argument 'src'

学习编程中的Ben 发表于 2023-8-8 14:53:20

根据报错信息,问题出现在第112行的代码,cv2.GaussianBlur函数的参数类型不正确。cv2.GaussianBlur期望的是一个cv::UMat类型的源图像(src),但是我们传入的是一个numpy数组类型的image,因此需要将其转换为cv::UMat类型。

以下是修改后的代码:

# 4. 消除噪声干扰
def denoise(images):
    denoised_images = []
    for image in images:
      # 将numpy数组转换为cv::UMat类型
      src = cv2.UMat(image)
      
      # 使用其他滤波方法,这里以高斯滤波为例
      denoised_image = cv2.GaussianBlur(src, (5, 5), 0)
      denoised_images.append(denoised_image)
    return denoised_images


请尝试使用修改后的代码运行,并检查是否仍然存在报错问题。如果还有其他报错,请提供详细的错误信息。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-8-8 14:53:20

报错的问题是在denoise()函数中,cv2.GaussianBlur()函数期望的是 src 参数为 Ptr<cv::UMat> 类型,但传入的image参数类型不匹配。

要解决这个问题,需要将image参数转换为 Ptr<cv::UMat> 类型。可以使用cv2.UMat()来实现转换。修改代码如下:

def denoise(images):
    denoised_images = []
    for image in images:
      # 转换图像类型
      image = cv2.UMat(image)
      # 使用其他滤波方法,这里以高斯滤波为例
      denoised_image = cv2.GaussianBlur(image, (5, 5), 0)
      denoised_images.append(denoised_image)
    return denoised_images


这样就将image参数转换为了Ptr<cv::UMat>类型,解决了报错问题。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-8-8 14:53:22

问题出在第112行,cv2.GaussianBlur函数的第一个参数需要传入一个指向图像数据的指针,而不是一个二值化的图像。解决这个问题的方法是,在调用denoise函数之前,将二值化的图像转换为灰度图像。具体来说,可以在edge_detection函数中,将二值化的图像转换为灰度图像,然后再返回。修改后的代码如下:

#3.检测目标地物
def edge_detection(images):
    edges = []
    for image in images:
      # 使用新的边缘检测方法
      edges_image = filters.roberts(image)

      # 计算全局阈值
      threshold = threshold_otsu(edges_image)
      # 进行二值化处理
      binary = edges_image > threshold
      
      # 将二值化的图像转换为灰度图像
      gray_image = color.rgb2gray(binary)
      
      edges.append(gray_image)
    return edges


然后重新运行代码,应该就不会再报错了。
页: [1]
查看完整版本: 请帮忙解决报错问题,给出正确代码。