【问题标题】:Image display error after changing dtype of image matrix更改图像矩阵的 dtype 后图像显示错误
【发布时间】:2016-10-15 21:52:55
【问题描述】:

我正在使用 opencv + python 来处理眼底(视网膜图像)。在将 float64 图像转换为 uint8 图像时,我遇到了一个问题。

以下是python代码:

import cv2
import matplotlib.pyplot as plt
import numpy as np
from tkFileDialog import askopenfilename

filename = askopenfilename()
a = cv2.imread(filename)
height, width, channel = a.shape
b, Ago, Aro = cv2.split(a)
mr = np.average(Aro)
sr = np.std(Aro)

Ar = Aro - np.mean(Aro)
Ar = Ar - mr - sr

Ag = Ago - np.mean(Ago)
Ag = Ag - mr - sr

#Values of elements in Ar
#    Ar = [[-179.17305527, -169.17305527, -176.17305527, ..., -177.17305527, -177.17305527, -177.17305527],
#           [-178.17305527, -169.17305527, -172.17305527, ..., -177.17305527, -177.17305527, -177.17305527],
#           [-179.17305527, -178.17305527, -179.17305527, ..., -177.17305527, -177.17305527, -177.17305527],
#           ...,
#           [-177.17305527, -177.17305527, -177.17305527, ..., -177.17305527, -177.17305527, -177.17305527],
#           [-177.17305527, -177.17305527, -177.17305527, ..., -177.17305527, -177.17305527, -177.17305527],
#           [-177.17305527, -177.17305527, -177.17305527, ..., -177.17305527, -177.17305527, -177.17305527]]

Mr = np.mean(Ar)
SDr = np.std(Ar)

print "MR = ", Mr, "SDr = ", SDr

Mg = np.mean(Ag)
SDg = np.std(Ag)
Thg = np.mean(Ag) + 2 * np.std(Ag) + 50 + 12

Thr = 50 - 12 - np.std(Ar)
print "Thr = ", Thr
Dd = np.zeros((height, width))
Dc = Dd
for i in range(height):
    for j in range(width):

        if Ar[i][j] > Thr:
            Dd[i][j] = 255
        else:
            Dd[i][j] = 0

TDd = np.uint8(Dd)
TDd2 = Dd

for i in range(height):
    for j in range(width):
        if Ag[i][j] > Thg:
            Dc[i][j] = 1
        else:
            Dc[i][j] = 0

#CALCULATING RATIO
ratio = 500.0 / Dd.shape[1]
dim = (500, int(Dd.shape[0] * ratio))
#
# #RESIZING TO-BE-DISPLAYED IMAGES
resized_TDd = cv2.resize(TDd, dim, interpolation=cv2.INTER_AREA)
resized_TDd2 = cv2.resize(TDd2, dim, interpolation=cv2.INTER_AREA)
resized_original = cv2.resize(Aro, dim, interpolation=cv2.INTER_AREA)

cv2.imshow('TDd', resized_TDd)
cv2.imshow('TDd2', resized_TDd2)
cv2.imshow('Aro', resized_original)
cv2.waitKey(0)

Ar[][] 有 -ve 和 +ve 值,Thr 有 -ve 值。 Dd 是我要显示的图像。 问题是TDd 显示了一个奇怪的图像(255s 和 0s 被分配给适当的像素,我检查了但是显示的图像很奇怪,与TDd不相似

原图

红色通道图像:

TDd(Dd 的 uint8):

TDd2(与 Dd 相同)

Dd2(初始化时声明 uint8 dtype)

为什么TDdTDd2 图像不同? 由于这两张图像中像素的灰度值之间的差异(据我所知)只有 255, 0 (TDd) 和 255.0, 0.0 (在 TDd2).

如果有人能告诉我,那将是一个很大的帮助。

【问题讨论】:

    标签: python opencv numpy


    【解决方案1】:

    看我执行了你的代码,有results

    它们对我来说似乎很正常...这正是我使用的 code

    Ar 与其他的不同,因为当您 imShow() 它时,它会将白色放在值 > 0 的黑色,否则。旅游代码后的其他矩阵变白,其中>Thr小于0,所以明显更多的像素变白。

    更新

    当你应该完成 Dc = np.zeros((height, width)) 时,你将 Dd 分配给了 Dc。

    【讨论】:

    • 我已经更新了代码,昨天我没有添加一个小的 sn-p,这导致你的结果和我的结果不一致(我尝试了旧代码,是的,他们给了我输出与您的相同)。给您带来的不便,我深表歉意,非常感谢您对我的帮助!能否请您现在重新运行代码并告诉我问题所在?
    • 问题是一个真正的菜鸟。当我应该完成 Dc = np.zeros((height, width)) 时,我将 Dd 分配给了 Dc。我不知道python中的内存引用!现在我觉得犯这个错误很愚蠢。我设法解决了它。如果你用这个更新你的答案,我会接受它作为答案并支持它作为对所有麻烦的感谢!非常感谢你的伙伴!
    • @hulkinBrain 哦,抱歉,我之前无法尝试您的代码。是的,不是您提到的,是的,这就是解决方案。我会更新我的答案。
    【解决方案2】:

    通常当图像用 np float64 数组表示时,RGB 值在 0 到 1 的范围内。因此,当转换为 uint8 时,从 float64 转换为 uint8 时可能会丢失精度。

    我会直接将 Dd 创建为:

    Dd = np.zeros((height, width), dtype=np.uint8)
    

    那么它应该可以工作了。

    【讨论】:

    • 不,即使这样也没有用。我忘了在问题中提到这一点。知道Dd 是彩色图像的红色通道会有所帮助吗?由于红色通道是灰度图像,因此只有 8 位。我已经编辑了问题。
    • 您更改了问题中的代码,但您仍然使用 Dd 而不是 Dd2。你确实试过了,对吗?所以即使你在你的代码中使用 Dd2 它也不起作用?
    • 你能给我看一个print(Dd2) 的例子和Thr 的值吗?有了我现在得到的信息,我能想到的并不多……
    • 是的,我试过了,不过感谢您指出,我会更新代码。我编写检查所有值是否仅为 255 或 0 的代码的目的只是为了检查 Dd2[i][j] 处的灰度值是否严格为 255 或 0只要。它没有显示任何内容,boogie number-ve numbertoo +ve 都没有,这意味着这些值只能是 255 或 0。请询问您是否需要更多信息,非常感谢您的帮助!
    • 我仍然不知道如何帮助您...您可以发布打印结果和您设置的变量值,例如ThrAr 矩阵的打印吗?
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2011-08-04
    • 2020-08-09
    • 2016-04-16
    相关资源
    最近更新 更多