이미지 처리 #2 RGB, 히스토그램

이 각서에 대해



최근 직장에서 딥러닝과 영상/영상 처리를 체험할 기회가 있었는데, 파라미터를 터치하고 데이터를 증폭하는 방법에 대해 이해하지 못하는 부분이 많아 영상 처리를 처음부터 공부하기로 했습니다.

컬러 이미지 및 회색조 이미지


  • 회색조 이미지: 픽셀 값은 밝기를 나타냅니다.
  • RGB 컬러 이미지: 픽셀 값은 각 RGB의 밝기를 나타냅니다(명확성을 위해 아래 이미지 참조).
  • 1픽셀: 8bit×3=24bit(3Byte)



  • 그러나 실제로는 3개의 R, G, B 계조 이미지로 구성되어 있다는 것이 정확한 이해입니다.
    자동차는 원래 빨간색이기 때문에 왼쪽 R 채널의 픽셀 값은 255에 가깝고 회색조 이미지에서는 흰색으로 나타납니다. 반면에 G 및 B 채널은 픽셀 값이 더 작아서 검은색으로 나타납니다.


    암호

    im = imread([file_path])
    
    imshow(im)
    plt.title("original RGB image")
    plt.show()
    
    r_channel = im[:, :, 0]
    g_channel = im[:, :, 1]
    b_channel = im[:, :, 2]
    
    fig = plt.figure(figsize=(15,3))
    
    for i, c in zip(range(3), 'RGB'):
        ax = fig.add_subplot(1, 3, i + 1)
        imshow(im[:, :, i], vmin=0, vmax=255)
        plt.colorbar()
        plt.title(f'{c} channel')
    
    plt.show()
    


    RGB&BGR



    유일한 차이점은 데이터의 해석이지만 주의해야 합니다.

    RGB


  • 많은 교과서 설명에 사용됩니다.
  • 많은 이미지 처리 라이브러리에서도 이 형식을 사용합니다.
  • skimage, Python용 matplotlib


  • BGR


  • 또한 자주 사용
  • opencv(파이썬, C/C++)
  • Windows의 COLORREF(16진수의 0x00bbggrr)
  • 하드웨어


  • 일반적인 실수는 opencv(BGR)로 로드된 이미지가 scikit-image(RGB)로 표시될 때 빨간색과 파란색이 반전된다는 것입니다.

    코드(오류의 예)

    im_BGR = cv2.imread(INPUT_DIR + 'IMG-4034.JPG') # OpenCV
    imshow(im_BGR) # matplotlibのimshowはRGBを仮定
    plt.title('show BGR image as RGB image')
    plt.axis('off')
    plt.show()
    


    다음을 포함하여 이 문제를 해결하는 몇 가지 방법이 있습니다.
    코드:RGB 및 GBR 변환

    ### use the built-in functions
    im_BGR_to_RGB = cv2.cvtColor(im_BGR, cv2.COLOR_BGR2RGB)
    imshow(im_BGR_to_RGB)
    plt.title('show RGB-converted BGR image as RGB image')
    plt.axis('off')
    plt.show()
    
    ### not use the built-in functions1
    im_BGR_to_RGB = im_BGR[:, :, ::-1]
    imshow(im_BGR_to_RGB)
    plt.title('show RGB-converted BGR image as RGB image')
    plt.axis('off')
    plt.show()
    
    ### not use the built-in functions1(explanation process of 1 above.)
    im_BGR_to_RGB = np.zeros_like(im_BGR)
    
    im_BGR_to_RGB[:, :, 0] = im_BGR[:, :, 2]
    im_BGR_to_RGB[:, :, 1] = im_BGR[:, :, 1]
    im_BGR_to_RGB[:, :, 2] = im_BGR[:, :, 0]
    
    imshow(im_BGR_to_RGB)
    plt.title('show RGB-converted BGR image as RGB image')
    plt.axis('off')
    plt.show()
    


    회색조 이미지를 만드는 방법.



    이를 수행하는 데 잘못된 방법이나 올바른 방법은 없으며 표준이 다를 뿐입니다.
    그러나 모든 방법이 거의 같아 보이지만 값이 다르기 때문에 함께 작업할 때 인식할 필요가 있습니다.

    내장 함수를 사용

    RGB 값의 합을 3으로 나눕니다.

    표준: PAL/NTSC

    표준: HDTV(내장 기능과 동일)

    암호

    im = imread(INPUT_DIR + 'IMG-4034.JPG')
    
    imshow(im)
    plt.title("original RGB image")
    plt.show()
    
    # Using the built-in rgb2gray function;gray = 0.2125 R + 0.7154 G + 0.0721 B
    im_gray1 = rgb2gray(im)
    imshow(im_gray1, vmin=0, vmax=1) # 型はfloat,範囲は[0,1]になる
    plt.colorbar()
    plt.title("rgb2gray min {0} max {1}".format(im_gray1.min(), im_gray1.max() ))
    plt.show()
    
    # The average of RGB is used as a grayscale image. First convert to float (the range will be [0,255]), then convert to uint8 for display.
    im_gray2 = (im[:,:,0].astype(float) +
                im[:,:,1].astype(float) + 
                im[:,:,2].astype(float)) / 3
    imshow(im_gray2, vmin=0, vmax=255)
    plt.colorbar()
    plt.title("(R+B+G)/3 min {0:.2f} max {1:.2f}".format(im_gray2.min(), im_gray2.max() ))
    plt.show()
    
    
    # The weighted average of RGB is used as the grayscale image.
    # https://en.wikipedia.org/wiki/Grayscale#Luma_coding_in_video_systems
    im_gray3 = (0.299 * im[:,:,0].astype(float) +
                0.587 * im[:,:,1].astype(float) + 
                0.114 * im[:,:,2].astype(float))
    imshow(im_gray3, vmin=0, vmax=255)
    plt.colorbar()
    plt.title("$\gamma'$ of PAL and NTSC min {0:.2f} max {1:.2f}".format(im_gray3.min(), im_gray3.max() ))
    plt.show()
    
    # The weighted average of RGB is used as a grayscale image. The weight coefficients vary depending on the standard.
    # https://en.wikipedia.org/wiki/Grayscale#Luma_coding_in_video_systems
    # This is what rgb2gray() uses.http://scikit-image.org/docs/dev/api/skimage.color.html#skimage.color.rgb2gray
    im_gray4 = (0.2126 * im[:,:,0].astype(float) +
                0.7152 * im[:,:,1].astype(float) + 
                0.0722 * im[:,:,2].astype(float))
    imshow(im_gray4, vmin=0, vmax=255)
    plt.colorbar()
    plt.title("$\gamma'$ of HDTV min {0:.2f} max {1:.2f}".format(im_gray4.min(), im_gray4.max() ))
    plt.show()
    


    히스토그램



    픽셀 값의 빈도 분포를 보여주는 그래프입니다.
    세 번째 사진은 화이트보드에 메타몬을 그린 모습이다.
    메타몬 그리기의 피크는 0.5~0.8 부근에서 볼 수 있지만, 마커의 잉크량(그리기 할 때 사용하는 힘의 양 등)에 따라 약간의 요철이 있습니다.
    또한 화이트보드 반대편(메타몬의 입 왼쪽)의 PC디스플레이가 반사되는 부분은 상당히 하얗다.이것이 0 부근에서 피크로 추정된다.




    암호

    im_files = ['file_path1', 'file_path2', 'file_path3']
    
    for file in im_files:
        im = imread(file)[:,:,:3]  # In the case of RGBA, extract only RGB
    
        fig = plt.figure(figsize=(20,3))
    
        ax = fig.add_subplot(1, 3, 1)
        im = rgb2gray(im) # Range;[0,1]
        imshow(im)
        plt.axis('off')
    
        bins = 256
    
        ax = fig.add_subplot(1, 3, 2)
        freq, bins = histogram(im)
        plt.plot(bins, freq)
        plt.xlabel("intensity")
        plt.ylabel("frequency")
        plt.title('histogram (linear)')
        plt.xlim(0,1)
    
    
        ax = fig.add_subplot(1, 3, 3)
        freq, bins = histogram(im)
        plt.plot(bins, freq)
        plt.xlabel("intensity")
        plt.ylabel("log frequency")
        plt.yscale('log')
        plt.title('histogram (log)')
        plt.xlim(0,1)
    
        plt.show();
    
    

    좋은 웹페이지 즐겨찾기