鱼C论坛

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

[已解决]更改边缘检测部分函数代码,使检测函数为自适应检测。

[复制链接]
发表于 2023-8-8 21:06:20 | 显示全部楼层 |阅读模式

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

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

x
代码:
from tifffile import imread, imwrite
import cv2
import numpy as np
# 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[start_row:end_row, start_col:end_col]
            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:
        # 使用其他边缘检测方法,这里以Sobel算子为例
        gradient_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
        gradient_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
        edges_image = cv2.magnitude(gradient_x, gradient_y)
        edges.append(edges_image)
    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[0].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[start_row:end_row, start_col:end_col] = images[i]
            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 = 7
num_cols = 11
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_output2.jpg')
最佳答案
2023-8-8 21:06:33
要使边缘检测函数为自适应检测,您可以使用自适应阈值方法,如自适应高斯阈值法。

以下是修改后的代码:

  1. # 3. 边缘检测(自适应)
  2. def edge_detection(images):
  3.     edges = []
  4.     for image in images:
  5.         # 将图像转换为灰度图像
  6.         gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  7.         
  8.         # 自适应高斯阈值法
  9.         edges_image = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
  10.         
  11.         edges.append(edges_image)
  12.     return edges
复制代码


在这里,我们使用cv2.adaptiveThreshold()函数来应用自适应高斯阈值法,生成二值化的边缘图像。

希望这个修改能满足您的需求。如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-8 21:06:33 | 显示全部楼层    本楼为最佳答案   
要使边缘检测函数为自适应检测,您可以使用自适应阈值方法,如自适应高斯阈值法。

以下是修改后的代码:

  1. # 3. 边缘检测(自适应)
  2. def edge_detection(images):
  3.     edges = []
  4.     for image in images:
  5.         # 将图像转换为灰度图像
  6.         gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  7.         
  8.         # 自适应高斯阈值法
  9.         edges_image = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
  10.         
  11.         edges.append(edges_image)
  12.     return edges
复制代码


在这里,我们使用cv2.adaptiveThreshold()函数来应用自适应高斯阈值法,生成二值化的边缘图像。

希望这个修改能满足您的需求。如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 21:06:44 | 显示全部楼层
要使边缘检测函数为自适应检测,可以使用自适应阈值方法替代固定阈值方法。以下是修改后的代码:

  1. def edge_detection(images):
  2.     edges = []
  3.     for image in images:
  4.         # 将图像转为灰度图像
  5.         gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6.         
  7.         # 使用自适应阈值方法进行边缘检测
  8.         edges_image = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
  9.         
  10.         edges.append(edges_image)
  11.     return edges
复制代码


在这个修改后的代码中,我们首先将图像转为灰度图像。然后,使用 cv2.adaptiveThreshold 函数进行自适应阈值处理。这个函数根据图像的局部区域计算阈值,从而实现自适应的边缘检测。 cv2.ADAPTIVE_THRESH_MEAN_C 参数表示使用局部区域的均值作为阈值, cv2.THRESH_BINARY 参数表示将大于阈值的像素设置为白色,小于阈值的像素设置为黑色。最后,将处理后的图像添加到结果列表中。

请注意,这个修改后的代码仅仅修改了边缘检测部分,其他部分保持不变。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 21:07:12 | 显示全部楼层
修改边缘检测部分函数代码,使其实现自适应边缘检测。
  1. import cv2
  2. import numpy as np
  3. def adaptive_edge_detection(images):
  4.     edges = []
  5.     for image in images:
  6.         # 自适应阈值边缘检测方法,这里使用自适应高斯阈值方法
  7.         gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  8.         blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
  9.         edges_image = cv2.adaptiveThreshold(blurred_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
  10.         edges.append(edges_image)
  11.     return edges
  12. # 调用自适应边缘检测函数进行检测
  13. adaptive_edges = adaptive_edge_detection(gray_images)
  14. # 其他代码保持不变
复制代码

完整修改后的代码如下:
  1. from tifffile import imread, imwrite
  2. import cv2
  3. import numpy as np
  4. # 1. 分割遥感影像为多块图幅
  5. def split_image(image, num_rows, num_cols):
  6.     height, width = image.shape[:2]
  7.     row_height = height // num_rows
  8.     col_width = width // num_cols
  9.     images = []
  10.     for r in range(num_rows):
  11.         for c in range(num_cols):
  12.             start_row = r * row_height
  13.             end_row = start_row + row_height
  14.             start_col = c * col_width
  15.             end_col = start_col + col_width
  16.             sub_image = image[start_row:end_row, start_col:end_col]
  17.             images.append(sub_image)
  18.     return images
  19. # 2. 分别对每块图幅转为灰度图像,并应用直方图均衡化
  20. def convert_to_grayscale(images):
  21.     grayscale_images = []
  22.     for image in images:
  23.         gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  24.         enhanced_image = cv2.equalizeHist(gray_image)  # 直方图均衡化增强对比度
  25.         grayscale_images.append(enhanced_image)
  26.     return grayscale_images
  27. # 修改的部分:自适应边缘检测函数
  28. def adaptive_edge_detection(images):
  29.     edges = []
  30.     for image in images:
  31.         # 自适应阈值边缘检测方法,这里使用自适应高斯阈值方法
  32.         gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  33.         blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
  34.         edges_image = cv2.adaptiveThreshold(blurred_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
  35.         edges.append(edges_image)
  36.     return edges
  37. # 4. 消除噪声干扰
  38. def denoise(images):
  39.     denoised_images = []
  40.     for image in images:
  41.         # 使用其他滤波方法,这里以高斯滤波为例
  42.         denoised_image = cv2.GaussianBlur(image, (5, 5), 0)
  43.         denoised_images.append(denoised_image)
  44.     return denoised_images
  45. # 5. 将各个图幅合并为一个图幅
  46. def merge_images(images, num_rows, num_cols):
  47.     row_height, col_width = images[0].shape[:2]
  48.     merged_image = np.zeros((row_height * num_rows, col_width * num_cols), dtype=np.uint8)
  49.     i = 0
  50.     for r in range(num_rows):
  51.         for c in range(num_cols):
  52.             start_row = r * row_height
  53.             end_row = start_row + row_height
  54.             start_col = c * col_width
  55.             end_col = start_col + col_width
  56.             merged_image[start_row:end_row, start_col:end_col] = images[i]
  57.             i += 1
  58.     return merged_image
  59. # 6. 导出结果
  60. def export_result(image, filename):
  61.     cv2.imwrite(filename, image)
  62. # 加载遥感影像
  63. image = imread(r"F:\duneline\dune\dune.tif")
  64. # 1. 分割遥感影像为多块图幅
  65. num_rows = 7
  66. num_cols = 11
  67. sub_images = split_image(image, num_rows, num_cols)
  68. # 2. 分别对每块图幅转为灰度图像
  69. gray_images = convert_to_grayscale(sub_images)
  70. # 3. 使用自适应边缘检测方法代替Canny算法
  71. adaptive_edges = adaptive_edge_detection(gray_images)
  72. # 4. 消除噪声干扰
  73. denoised_edges = denoise(adaptive_edges)
  74. # 5. 将各个图幅合并为一个图幅
  75. merged_image = merge_images(denoised_edges, num_rows, num_cols)
  76. # 6. 导出结果
  77. export_result(merged_image, 'path_to_output2.jpg')
复制代码

请根据你的需求将“path_to_output2.jpg”替换为实际的输出路径。

如果回答对你有帮助,请给我一个最佳答案!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 21:14:18 | 显示全部楼层
给个最佳答案呗!求你了!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 23:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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