【问题标题】:matplotlib imshow gray colormap additional preprocessmatplotlib imshow gray colormap 附加预处理
【发布时间】:2021-09-02 11:03:47
【问题描述】:

我有一堆图像,我随机发现对我的图像最好的预处理是使用 matplotlib imshow 和 cmap=gray。这是我的 RGB 图像(我不能发布原始图像,这是我为说明我的观点而创建的示例。所以原始图像不是像这样无噪音和完美的):

当我使用plt.imshow(img, cmap='gray') 时,图像将是:

我想在 Opencv 中实现这个过程。我尝试使用 OpenCV 颜色图,但那里没有任何灰色。我使用了these solutions,但结果就像第一张图片而不是第二张。 (result here)

所以我想知道除了更改颜色图之外,当我们调用imshow 时,matplotlib 对图像应用了哪些预处理?

P.S:您可能会建议二值化,我已经测试了这两种技术,但在我的数据二值化会破坏一些样本,而这种方法 (matplotlib) 不会。

【问题讨论】:

    标签: python opencv matplotlib


    【解决方案1】:

    cv::normalizeNORM_MINMAX 应该可以帮助您。它可以映射强度值,使最暗的变为黑色,最亮的变为白色,而不管绝对值是多少。

    OpenCV 文档的这一部分包含示例代码。这是一个固定链接。

    或者当 normType=NORM_MINMAX 时 minIdst(I)=alpha, maxIdst(I)=beta(仅适用于密集数组)

    这意味着,对于 NORM_MINMAX,alpha=0,beta=255。这两个参数对于不同的 normTypes 有不同的含义。对于 NORM_MINMAX ,似乎代码会自动交换它们,因此将两者的较低值用作下限等。

    此外,uint8 类型数据的范围是0 .. 255。给1 只对浮点数据有意义。

    示例:

    import numpy as np
    import cv2 as cv
    im = cv.imread("m78xj.jpg")
    normalized = cv.normalize(im, dst=None, alpha=0, beta=255, norm_type=cv.NORM_MINMAX)
    cv.imshow("normalized", normalized)
    cv.waitKey(-1)
    cv.destroyAllWindows()
    

    应用中值模糊来去除噪声像素(超出文本的平均灰度):

    blurred = cv.medianBlur(im, ksize=5)
    # ...normalize...
    

    或手动进行缩放。应用中值模糊,在那个版本中找到最大值,然后将其应用到原始图像。

    output = im.astype(np.uint16) * 255 / blurred.max()
    output = np.clip(output, 0, 255).astype(np.uint8)
    # ...
    

    【讨论】:

    • 谢谢,我尝试了这种方法,但无论我使用什么 alpha 和 beta (0,1 - 0,255 - 0,127),输出都是一个完全黑色的图像 as you can see hereimg = cv2.normalize(img, 0, 1, cv2.NORM_MINMAX)
    • 好的,现在我已经根据您的图片尝试了这个(查看文件名,匹配您帖子中的图片),我得到了不错的结果。文本不是完美白色的,因为文件包含锐化,这会导致一些嘈杂的像素变为 255。
    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2020-12-29
    • 2020-06-24
    • 2019-01-22
    • 2015-07-30
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多