当前位置: 首页 > 知识库问答 >
问题:

我试图在不剪裁的情况下操纵像素值

洪和平
2023-03-14

我有一个图像,它有一个最大像素值-287.4976094062538和最小像素值--41.082841881780645我试图使它们在范围之间0-255

我所做的:-

  • 我已经将所有像素值除以最大像素值再乘以255
  • 这使得我的最高像素值为1,但我的最小像素值仍然是负像素值-0.14

这是一个医学图像,所以我想保留每个像素强度,所以我不想在0-255之间剪辑它们

但是我怎么能在不裁剪的情况下把它们放在那个范围内(这会损坏图像结构)。

使用库加载它们,如matplotlibPIL自动剪裁像素值。

共有2个答案

祝俊雄
2023-03-14

Scikit image具有以下功能:

https://scikit-image.org/docs/dev/api/skimage.exposure.html#skimage.exposure.rescale_intensity

最好将其重新缩放到范围(0,1),以浮点格式进行所有处理,并在保存之前转换为int8。

In [1]: from skimage.exposure import rescale_intensity
In [2]: from skimage import img_as_ubyte
In [3]: import numpy as np

In [4]: im = np.random.uniform(low=-100, high=400, size=(3,3))

In [5]: im
Out[5]: 
array([[351.2177509 , 313.89196632, 241.73850855],
       [-21.12284801,  97.84166107, -66.925235  ],
       [267.75593733, -15.78767759, 252.63980599]])

In [6]: im = rescale_intensity(im, in_range='image', out_range=(0,1))

In [7]: im
Out[7]: 
array([[1.        , 0.9107344 , 0.7381775 ],
       [0.10953762, 0.39404439, 0.        ],
       [0.80039887, 0.12229682, 0.76424824]])

In [8]: im = img_as_ubyte(im)  # 8bit

In [9]: im
Out[9]: 
array([[255, 232, 188],
       [ 28, 100,   0],
       [204,  31, 195]], dtype=uint8)

如果这是黑色的

如果你有更多相似的图像,你可以使用自定义的in_范围,这样所有图像的缩放都是一致的,正如Guang所建议的。

import numpy as np
from skimage.exposure import rescale_intensity
from skimage import img_as_uint
from imageio import imwrite


im = np.linspace(-40,288,10000).reshape(100,100)
im = rescale_intensity(im, in_range=(-100,400), out_range=(0,1))
im = img_as_uint(im)  # 16bit
imwrite("image.png", im)

编辑:如果您不想使用scikit图像,可以定义类似的功能,如下所示:

def rescale_intensity(arr, in_range=None, out_range=(0, 1)):
    """Normalize numpy array.
    Returns: float array
    """
    imin, imax = in_range if in_range is not None else (np.min(arr), np.max(arr))
    omin, omax = out_range
    if imin == imax:
        raise ValueError("Cannot rescale array, imin == imax")
    else:
        z = omin + omax * ((arr - imin) / (imax - imin))
    return np.clip(z, a_min=omin, a_max=omax)
    
松霖
2023-03-14

你只是在标准化图像的正范围,忽略负值。

您希望将以下等式应用于您的值:

mx = np.amax(img)
mn = np.amin(img)
img = (img - mn) / (mx - mn) * 255

我们首先减去最小值,这样图像中的最小值就变成了0。接下来我们除以将最大值设置为1。mx-mn是数据的全部范围,因此将最小值设置为0后数据中的最大值。

 类似资料:
  • 问题是如何使用OpenCV旋转图像并保持原始尺寸。当前正在使用此功能: 此外,在warpAffine中使用了什么样的算法(Bicubic?)

  • 我试图在从图库中选择图像后使用intent来裁剪图像。以下是我的代码片段 在这里,我使用PICK_IMAGE_REQUEST意图句柄调用上面的代码段 由于我在裁剪后使用了相同的意图,即PICK_IMAGE_REQUEST,可能会出现什么问题

  • 我将<code>背景 1.back_xml: 2.瓷砖.xml 现在,我将back.xml设置为< code >背景以< code>LinearLayout工作正常。 我需要有一个圆角,以及它的边框。但是我只有圆角的边框,而不是图像,我的代码中有什么问题吗? 这是我的照片:

  • 本节,我们将裁剪图像的一部分,然后把其结果绘制到画布上。 图3-2 裁剪图像 绘制步骤 按照以下步骤,裁剪图像的一部分,再把结果绘制到画布: 1. 定义画布上下文: window.onload  = function(){ var canvas  = document.getElementById("myCanvas"); var context  = canvas.getContext

  • 问题内容: 我正在尝试裁剪图像,然后将裁剪后的图像粘贴到另一个图像的中心。理想情况下,我希望裁切后的图像小于粘贴的图像,以便在粘贴的图像周围有一个边框,但我不知道这样是否可行。 这是我尝试过的方法(以及由此产生的错误消息): 我可以看到“区域”的大小已设为(0,0),但我不明白为什么。 任何对此的帮助将非常感谢 问题答案: 裁剪方法的PIL文档指出: 返回当前图像的矩形区域。该框是一个四元组,定义

  • 我需要对matlab中的图像执行以下操作: 加载图像 计算图像的FFT(快速傅立叶变换) 将频率分量移到中心 像follow一样裁剪图像(如果图像分辨率为1000x1000,则图像所需的部分类似于以下坐标:100100800800。这是一个较小的图像。(应用过滤器去除高频的想法) 反向移位 傅里叶逆变换 . . . 我的代码如下所示: 问题是,当我想裁剪图像时,我的功能无法裁剪类型为“复杂双”的图