Как нормализовать изображение в формате tiff - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь установить некоторые определенные c пикселей внутри изображения на черный, эти изображения находятся в формате tiff, что требует от меня разложения их в соответствующие кадры, поэтому мое изображение tiff имеет 50 разных кадров. Для такой задачи я использую простые значения, обращаясь к индексу пикселей в их заданной позиции и просто устанавливая их значения на 0. Например:

img[10, 50] = 0

каждый раз, когда я пытаюсь установить их пиксели, изображение мгновенно становится желтым. .

enter image description here

However, if I remove every line that changes/sets the pixel values to black, the image goes back to normal.

Here's my code:

from PIL import Image
%pylab inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg


image = "myimage.tif"
path = "C:/Dataset/Face1" + image

 plt.imshow(img)
img=mpimg.imread(path)
img[15, 60] = 0
img[15, 85] = 0
img[15, 105] = 0
img[35, 60] = 0
img[35, 85] = 0
img[35, 105] = 0
img[45, 60] = 0
img[43, 75] = 0
img[43, 92] = 0
img[43, 105] = 0
img[58, 55] = 0
img[65, 83] = 0
img[58, 110] = 0
img[75, 83] = 0
img[85, 75] = 0
img[85, 90] = 0
img[90 ,83] = 0
img[95, 60] = 0
img[99, 83] = 0
img[99, 103] = 0

I tried normalizing my image the easy way using opencv2:

img1 = cv2.imread('image.tif', cv2.IMREAD_GRAYSCALE)
final_img = cv2.normalize(img1,  img1, 0, 255, cv2.NORM_MINMAX)

Got this instead:

введите описание изображения здесь

Как я разлагаю изображения

from PIL import Image
import matplotlib.pyplot as plt
imagepath = "face1.tif"
path = "C:/Users/images/" + imagepath
img = Image.open(path)

for i in range(50):
    try:
        img.seek(i)
        img.save('C:/Users/images/face1/%s.tif'%(i,))
    except EOFError:
        break

Я хочу нормализовать изображение, когда я печатаю значения одного из самых светлых пикселей, на выходе получается что-то около 8353. Кроме того, преобразуйте его в 8-битное изображение, чтобы я мог просмотреть его на matplotlib.

Ответы [ 2 ]

1 голос
/ 22 июня 2020

Вы можете выполнить правильную нормализацию, используя Scipy Exposition.rescale_intensity () с Python / OpenCV.

Далее я использую OpenCV для чтения многостраничного TIFF и обработки кадров в al oop как следует:

import cv2
import numpy as np
import skimage.exposure as exposure

# read images
imgs = cv2.imreadmulti("face_1.tif", flags = cv2.IMREAD_GRAYSCALE + cv2.IMREAD_ANYDEPTH)[1]

for i,img in enumerate(imgs):
    filename = f"face_1_frame-{i}.png"
    print(f"Processing frame {i} into file {filename}")
    # normalize image to 8-bit range
    img_norm = exposure.rescale_intensity(img, in_range='image', out_range=(0,255)).astype(np.uint8)
    cv2.imwrite(filename, img_norm)

    # display normalized image
    cv2.imshow('normalized',img_norm)
    cv2.waitKey(0)

Вот первый нормализованный кадр:

введите описание изображения здесь

1 голос
/ 21 июня 2020

Скорее всего, ваши изображения используют нестандартную схему кодирования. Обычно значения пикселей (для одного канала) ограничены [0..255]. В вашем случае значения пикселей l ie в диапазоне [8162..8383]. matplotlib автоматически нормализует этот диапазон. Но когда вы устанавливаете одно из значений пикселя на 0, ваш диапазон становится [0..8383], и это причина, по которой он изо всех сил пытается его отобразить. Просто нормализуйте данные:

from matplotlib import pyplot as plt
img = plt.imread(r'C:\temp\face_1.tif')
img -= img.min() # you can use more sofisticated img = 255*(img - img.min())/(img.max() - img.min())
img[90 ,83] = 0
img[95, 60] = 0
img[99, 83] = 0
img[99, 103] = 0
plt.imshow(img, cmap='gray')
plt.show()

И вы получите: введите описание изображения здесь

...