Как сбалансировать изображения с помощью Numpy / PIL - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь выяснить, как сбалансировать изображения с помощью numpy и PIL. Я использую камеру IDS, и все снимки, которые мы делаем, выглядят очень темными и имеют синий оттенок, а также непостоянное качество изображения, иногда изображения создаются полностью, а иногда эти большие черные полосы проходят горизонтально по всей длине. образ. Вот изображение, на которое я ссылаюсь

Вот камера, которую мы используем: https://en.ids-imaging.com/manuals/uEye_SDK/EN/uEye_Manual_4.93/index.html

from pyueye import ueye
import numpy as np
import sys
from PIL import Image
import cv2

hCam = ueye.HIDS(0)             
sInfo = ueye.SENSORINFO()
cInfo = ueye.CAMINFO()
pcImageMemory = ueye.c_mem_p()
MemID = ueye.int()
rectAOI = ueye.IS_RECT()
pitch = ueye.INT()
nBitsPerPixel = ueye.INT(24)   
channels = 3                    
m_nColorMode = ueye.IS_CM_RGBA12_UNPACKED #IS_CM_BGRA8_PACKED       
bytes_per_pixel = int(nBitsPerPixel / 8)

#Camera Init 
nRet = ueye.is_InitCamera(hCam, None)
if nRet != ueye.IS_SUCCESS:
    print("is_InitCamera ERROR")

#Get Sensor Info 
nRet = ueye.is_GetSensorInfo(hCam, sInfo)
if nRet != ueye.IS_SUCCESS:
    print("is_GetSensorInfo ERROR")

#Set Display Mode
nRet = ueye.is_SetDisplayMode(hCam, ueye.IS_SET_DM_DIB)

#Set Color mode 
nRet = ueye.is_SetColorMode(hCam, ueye.IS_CM_BGR8_PACKED)

#Area of Interest 
nRet = ueye.is_AOI(hCam, ueye.IS_AOI_IMAGE_GET_AOI, rectAOI, ueye.sizeof(rectAOI))
if nRet != ueye.IS_SUCCESS:
    print("is_AOI ERROR")

#Define Width and Height 
width = rectAOI.s32Width
height = rectAOI.s32Height

# Prints out some information about the camera and the sensor
print("Camera model:\t\t", sInfo.strSensorName.decode('utf-8'))
print("Camera serial no.:\t", cInfo.SerNo.decode('utf-8'))
print("Maximum image width:\t", width)
print("Maximum image height:\t", height)
print()

#Allocate Image Memory 
nRet = ueye.is_AllocImageMem(hCam, width, height, nBitsPerPixel, pcImageMemory, MemID)
if nRet != ueye.IS_SUCCESS:
    print("is_AllocImageMem ERROR")

#Add to Sequence 
nRet = ueye.is_AddToSequence(hCam , pcImageMemory ,  MemID)
if nRet != ueye.IS_SUCCESS:
    print("is_AddToSequence ERROR")

#Capture Video 
nRet = ueye.is_CaptureVideo(hCam, ueye.IS_DONT_WAIT)
if nRet != ueye.IS_SUCCESS:
    print("is_CaptureVideo ERROR")

#Inquire Image Memory 
nRet = ueye.is_InquireImageMem(hCam, pcImageMemory, MemID, width, height, nBitsPerPixel, pitch)
if nRet != ueye.IS_SUCCESS:
    print("is_InquireImageMem ERROR")

#Image Display 
array = [0]
# Continuous image display
while(nRet == ueye.IS_SUCCESS):

    nRet = ueye.is_InquireImageMem(hCam, pcImageMemory, MemID, width, height, nBitsPerPixel, pitch)
    if nRet != ueye.IS_SUCCESS:
        print("is_InquireImageMem ERROR")
    while array[0] == 0:
        array = ueye.get_data(pcImageMemory, width.value, height.value, nBitsPerPixel.value, pitch.value, copy=False)

    print(array)

    frame = np.reshape(array,(height.value, width.value, bytes_per_pixel))
    #print(frame)
    img = Image.fromarray(frame,'RGB')
    img.show()

    break

ueye.is_FreeImageMem(hCam, pcImageMemory, MemID)
ueye.is_ExitCamera(hCam)

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

1 Ответ

2 голосов
/ 09 марта 2020

Ваше изображение имеет синий оттенок, потому что вы установили камеру в режим BGR, но ваш PIL.Image () - RGB. Это означает, что ваш красный и синий каналы поменялись местами. Т.е. все, что есть в мире, синее будет красным, а все красное будет синим. Таким образом, проблема легко решается либо установкой камеры в режим RGB, либо переключением каналов R и B в изображении PIL () впоследствии. Если камера не поддерживает RGB, она может поддерживать систему YUV, и у вас есть изображения PIL типа «YUV». Это решило бы вашу проблему. Если вам нужно поменять местами каналы вручную, вы можете использовать Image.split (), чтобы разделить изображение на каналы RGB, а затем использовать Image.merge (), чтобы создать новое изображение () с замененными каналами.

i = <some_Image()_that_is_BGR>
b, g, r = i.split()
i = Image.merge("RGB", (r, g, b))

Но, если на вашем изображении появляются какие-то странные линии, которых нет нигде, я боюсь, что ваша CCD I C закончена и вам нужна новая камера.

...