代码之家  ›  专栏  ›  技术社区  ›  rocky king

如何在cv2 python中将灰度图像转换为彩色图像

  •  3
  • rocky king  · 技术社区  · 7 年前

    我在低通FFt中使用cv2 python,我已经更改了图像的属性,但这是一幅灰色图像。我想将其更改为彩色图像并保留灰色图像的属性

    ----------
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    
    img = cv2.imread('rocket.jpg', 0)
    height, width = img.shape
    
    plt.figure("Input")
    plt.subplot(221),plt.imshow(img, cmap = 'gray')
    plt.title('Input Image'), plt.xticks([]), plt.yticks([])
    
    fft = np.log(np.abs(np.fft.fftshift(np.fft.fft2(img))))
    plt.subplot(222),plt.imshow(fft, cmap = 'gray')
    plt.title('Fourier Transform'), plt.xticks([]), plt.yticks([])
    
    r = 200
    h_Filter_Low_Pass = np.zeros(img.size, img.dtype).reshape(img.shape)
    for icounter in range(1, height):
        for jcounter in range(1, width):
            if ((height/2-icounter)**2 + (width/2 - jcounter)**2)**0.5 < r:
                h_Filter_Low_Pass[icounter, jcounter] = 1
    plt.subplot(223),plt.imshow(h_Filter_Low_Pass, cmap = 'gray')
    plt.title('Filter'), plt.xticks([]), plt.yticks([])
    
    h_fft = (np.abs(np.fft.fftshift(np.fft.fft2(h_Filter_Low_Pass)))+1)
    plt.subplot(224),plt.imshow(h_fft, cmap = 'gray')
    plt.title('Fourier Transform (Filter)'), plt.xticks([]), plt.yticks([])
    
    fshift = np.fft.fftshift(np.fft.fft2(img))
    
    
    plt.figure("output")
    new = fshift * (h_Filter_Low_Pass)
    g_ifft1 = (np.abs(np.fft.ifft2(np.fft.ifftshift(new)).real))
    
    
    
    plt.subplot(),plt.imshow(g_ifft1, cmap = 'gray')
    plt.title('output'), plt.xticks([]), plt.yticks([])
    plt.show()
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Andriy Makukha    7 年前

    代替线条:

    fshift = np.fft.fftshift(np.fft.fft2(img))
    new = fshift * (h_Filter_Low_Pass)
    g_ifft1 = (np.abs(np.fft.ifft2(np.fft.ifftshift(new)).real))
    
    plt.subplot(),plt.imshow(g_ifft1, cmap = 'gray')
    

    您可能需要使用:

    img_color = cv2.imread('rocket.jpg')
    b,g,r = cv2.split(img_color)
    def g_ifft(x):
        fshift = np.fft.fftshift(np.fft.fft2(x))
        new = fshift * (h_Filter_Low_Pass)
        g_ifft1 = (np.abs(np.fft.ifft2(np.fft.ifftshift(new)).real))
        g_ifft1 = cv2.normalize(g_ifft1,None,0,255,cv2.NORM_MINMAX, cv2.CV_8U)
        return g_ifft1
    b,g,r = map(g_ifft, (b,g,r))
    g_ifft1 = cv2.merge((b,g,r))
    
    g_ifft1 = cv2.cvtColor(g_ifft1, cv2.COLOR_BGR2RGB)
    
    plt.subplot(),plt.imshow(g_ifft1)
    

    这会将图像分割为多个颜色通道,将过滤器分别应用于每个颜色通道,然后再次合并它们。(需要规范化步骤来转换数组 float64 uint8 合并前键入。)

    输出示例:

    Dnipro rocker, Fourier transform, mask

    Dnipro rocket with Fourier transform applied