码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【NNDL作业】图像锐化后,为什么“蒙上了一层灰色”?


    目录

    图像“蒙上灰色”的原因:出现了大于255,小于0的情况

    顺着同学的思路,继续思考了一下 (0-255)之外的数据

    官方文档

    norm Normalize, optional

    vmin, vmax  float, optional

    结论:设置imshow参数 vmax,vmin 可以解决问题

    效果对比

    源代码


    别被打脸的作业中提到:

    大家可能在输出时发现,图像会出现一种灰色的现象,也就是下边的现象。

    图像“蒙上灰色”的原因:出现了大于255,小于0的情况

    对此最好的解决,其实是归一化的东西,也就是,找一种类似于映射的东西,把它全都投影到0到255,这样临近点之间的关系并不会丢失,这样一定会有完整的图像。

     由于图像是由像素点之间的关系体现出来的,所以最好的解决办法是映射,其次是换一个卷积核,再其次是就是我下边说的比较偷懒的方法。

    源代码:

    1. # coding=gbk
    2. import numpy as np
    3. import torch
    4. from torch import nn
    5. from torch.autograd import Variable
    6. from PIL import Image
    7. import matplotlib.pyplot as plt
    8. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    9. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容
    10. # https://blog.csdn.net/weixin_40123108/article/details/83510592
    11. file_path = 'csdn.jpg'
    12. im = Image.open(file_path).convert('L') # 读入一张灰度图的图片
    13. im = np.array(im, dtype='float32') # 将其转换为一个矩阵
    14. print(im.shape[0], im.shape[1])
    15. plt.imshow(im.astype('uint8'), cmap='gray') # 可视化图片
    16. plt.title('原图')
    17. plt.show()
    18. im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
    19. conv1 = nn.Conv2d(1, 1, 3 ,bias=False,padding=1) # 定义卷积
    20. sobel_kernel = np.array([[0, -1, 0],
    21. [-1, 5, -1],
    22. [0, -1, 0]], dtype='float32') # 定义轮廓检测算子
    23. sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
    24. conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值
    25. edge1 = conv1(Variable(im)) # 作用在图片上
    26. for i in range(edge1.shape[2]):
    27. for j in range(edge1.shape[3]):
    28. if edge1[0][0][i][j]>255:
    29. edge1[0][0][i][j]=255
    30. if edge1[0][0][i][j]<0:
    31. edge1[0][0][i][j]=0
    32. x = edge1.data.squeeze().numpy()
    33. print(x.shape) # 输出大小
    34. plt.imshow(x, cmap='gray')
    35. plt.show()

    处理后和处理前的效果:

    对比一下,效果很明显。


    发现问题并解决问题,非常好的实验。 

    NNDL 作业5:卷积_别被打脸的博客-CSDN博客

    别被打脸 ;真不想再学了; 不是蒋承翰

    室友三人共同探讨解决问题,学习氛围很好,一定要继续保持。


    顺着同学的思路,继续思考了一下 (0-255)之外的数据

    matplotlib.pyplot.imshow() 是如何处理的?


    应用matplotlib的imshow函数显示彩色图像(RGB data)报错的解决方法提到:

    对于二维数组(灰度图像),函数会自动将输入数据归一化变换至[0,1],然后显示。


    Plt imshow没有自动处理负值(python)提到:

    imshow通过适当缩放亮度值自动处理负值,因此最小(负值)值将显示为黑色,接近零的值将显示为灰色,而最高值将显示为白色。


    图像的像素值为负是什么情况? 提到:


    官方文档

    matplotlib.pyplot.imshow

    norm Normalize, optional

    The Normalize instance used to scale scalar data to the [0, 1] range before mapping to colors using cmap.

    By default, a linear scaling mapping the lowest value to 0 and the highest to 1 is used.

    This parameter is ignored for RGB(A) data.


    vmin, vmax  float, optional

    When using scalar data and no explicit norm, vmin and vmax define the data range that the colormap covers.

    By default, the colormap covers the complete value range of the supplied data.

    It is an error to use vmin/vmax when norm is given.

    When using RGB(A) data, parameters vmin/vmax are ignored.


    结论:设置imshow参数 vmax,vmin 可以解决问题

    plt.imshow(x, cmap='gray', vmin=0, vmax=255)


    效果对比

    依次为:原图 - 锐化后 - 同学的方法 - 设置参数的方法

     

    源代码

    1. import numpy as np
    2. import torch
    3. from torch import nn
    4. from torch.autograd import Variable
    5. import torch.nn.functional as F
    6. from PIL import Image
    7. import matplotlib.pyplot as plt
    8. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    9. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容
    10. # https://blog.csdn.net/weixin_40123108/article/details/83510592
    11. file_path = 'deer.jpg'
    12. im = Image.open(file_path).convert('L') # 读入一张灰度图的图片
    13. im = np.array(im, dtype='float32') # 将其转换为一个矩阵
    14. print(im.shape[0], im.shape[1])
    15. plt.imshow(im.astype('uint8'), cmap='gray') # 可视化图片
    16. plt.title('原图')
    17. plt.show()
    18. im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
    19. conv1 = nn.Conv2d(1, 1, 3, bias=False) # 定义卷积
    20. sobel_kernel = np.array([[0, -1, 0],
    21. [-1, 5, -1],
    22. [0, -1, 0]], dtype='float32') # 定义轮廓检测算子
    23. sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
    24. conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值
    25. edge1 = conv1(Variable(im)) # 作用在图片上
    26. x = edge1.data.squeeze().numpy()
    27. print(x.shape) # 输出大小
    28. print(x)
    29. plt.imshow(x, cmap='gray', vmin=0, vmax=255)
    30. plt.show()

    其他解决方案

    [2022-10-09]神经网络与深度学习 hw5 - 卷积_三工修的博客-CSDN博客

    img_new = torch.clamp(img_new,0.,255.)

  • 相关阅读:
    【Python数据科学快速入门系列 | 03】玩转数据摘取:Numpy的索引与切片
    pytorch-12 深度学习基础网络的数据集创建及手动搭建实现
    【性能测试入门必看】性能测试理论知识
    【日常-bug】文件上传oss报错-跨域- ‘Access-Control-Allow-Origin
    kitti2bag 安装出现的各种错误
    期望值、方差和标准差分别描述了什么?
    C语言画直方图
    Qt设置字体格式和颜色
    vue3+ts 异步组件的使用
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java扶贫产品和扶贫物资捐赠系统r32rk
  • 原文地址:https://blog.csdn.net/qq_38975453/article/details/127344121
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号