python - Matplotlib 将黑白图像显示为灰色
问题描述
我有一个简单的代码来加载 RGB 图像,将其转换为灰度,然后运行 Canny 边缘检测器算法。返回的图像仅包含 0 和 255 个值,但是当使用 matplotlib 显示图像时,它会将图像显示为灰度(而不是黑白)。
我怎样才能解决这个问题?
我的代码 -
import cv2
import matplotlib.pyplot as plt
in_img = cv2.imread('colored_image.jpeg')
gray_in_img = cv2.cvtColor(in_img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray_in_img, 100, 155)
fig = plt.figure(1)
ax = fig.add_subplot(1, 3, 1)
ax.imshow(cv2.cvtColor(in_img, cv2.COLOR_BGR2RGB))
ax = fig.add_subplot(1, 3, 2)
ax.imshow(gray_in_img, cmap='gray')
ax = fig.add_subplot(1, 3, 3)
ax.imshow(edges, cmap='gray')
plt.show()
输出图为:
放大最后一张图像,我们可以看到其中包含各种灰度强度,而不仅仅是黑白:
而我希望最后一张图像是黑白图像,例如:
当我调试代码时,我检查了 的值edges
确实只有 0
and 255
。
原始 RGB 图像:
解决方案
图像只有edges
黑白:
import numpy as np
np.unique(edges)
#array([ 0, 255], dtype=uint8)
当您放大交互式后端时,您会看到边缘确实只有黑白。
默认情况下,imshow
使用'antialiased'
插值导致小比例图像的一些灰度值。您可以使用'none'
or 'nearest'
来防止这种情况:
ax.imshow(edges, cmap='gray', interpolation='nearest')
当您将图像保存为压缩格式(例如png
)时,由于压缩,您还会在保存的图像中看到一些灰度值。您可以通过使用无损压缩或不压缩来防止这种情况发生,例如另存为tif
或保存png
为pil_kwargs={'compress_level': 0}
.
根据以下评论中的讨论进行更新:
要查看具有纯黑白所有细节的完整精确图像,您需要缩放edges
图像,以便 1 个图像像素 = 1 个显示像素(您可以使用它tkinter
来获取屏幕的 dpi 设置):
import tkinter
dpi = tkinter.Tk().winfo_fpixels('1i')
fig,ax = plt.subplots(dpi=dpi)
plt.axis('off') # no ticks/tick labels
fig.subplots_adjust(0,0,1,1) # no margins
fig.set_size_inches(edges.shape[1]/dpi, edges.shape[0]/dpi) # 1 dot = 1 pixel
ax.imshow(edges, cmap='gray')
结果(以 100 % 的 Web 浏览器缩放比例查看)
推荐阅读
- c# - 没有 cc 或 bcc 收件人时的 Microsoft Graph API 问题
- c++ - 为什么 libc++ 允许递归锁定 std::mutex?
- azure-synapse - 中型 RC 中的单个查询导致 Azure 专用 SQL 池中的 CPU 达到 100%
- tensorflow - 是否可以保存 Tensorboard 会话?
- javascript - 来自ajax php程序的Highcharts系列setData
- amazon-web-services - 错误:: ResourceNotFoundException: 在 AWS.config.credentials.refresh 中找不到请求的资源
- lowercase - 如何将两个字符串之间的文本小写
- java - JMS 动态消息选择
- typescript - “结构类型保护”适用于 `if`,但不能用作数组过滤谓词
- python - 无法在 iconomi 的 python 中使用 sha512 签署消息