【问题标题】:how to convert gray to color image in cv2 python如何在cv2 python中将灰色转换为彩色图像
【发布时间】:2018-09-24 18:27:36
【问题描述】:

我在低通 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()

【问题讨论】:

    标签: python opencv cv2


    【解决方案1】:

    代替行:

    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类型。)

    示例输出:

    【讨论】:

    • 在函数g_ifft(x)中有参数x,但是你没有把参数放在函数中,函数怎么知道你用的是什么图片?
    • 函数g_ifft通过内置map函数应用于序列(b,g,r)。阅读文档:docs.python.org/2/library/functions.html#map
    • 欢迎您!请把我的答案设为“最佳答案”。
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2016-01-11
    • 2015-10-07
    • 1970-01-01
    相关资源
    最近更新 更多