Python-图像-伪彩色图像处理

目录

1.强分层法

2.灰度级彩色变换

3.频率域彩色变换


1.强分层法

按层划分灰度级数(像素幅值),每层灰度与单一颜色进行映射

def strong_layering(img,layer):
    """
    强分层法
    :param img: 输入灰度图像
    :param layer: 灰度级数分层数
    :return:伪彩色增强图像(ndim=2)
    """
    w,h = img.shape[:2]
    img_color = np.zeros((w,h),dtype=np.uint8)

    for row in range(w):
        for col in range(h):
            interval = 256//layer #分层的灰度级数间隔
            I_layer = img[row][col]//interval#像素所在层数(0-layer)
            img_color[row][col] = I_layer*interval

    return img_color

2.灰度级彩色变换

灰度级和RGB颜色按一定关系映射

Python-图像-伪彩色图像处理_第1张图片Python-图像-伪彩色图像处理_第2张图片

Python-图像-伪彩色图像处理_第3张图片

def color_enhence(img):
    """
    伪彩色增强(根据图像灰度值进行伪彩色划分)
    :param img: 输入灰度图像
    :return img_color:伪彩色增强图像(ndim=2)
    """
    w,h = img.shape
    img_color = np.zeros((w,h,3)) # 0:R // 1:G //2::B

    for row in range(w):
        for col in range(h):
            I_gray = img[row][col]
            if I_gray>=0 and I_gray<64:  # (0-64)
                img_color[row][col][0]=0
                img_color[row][col][1]=I_gray*4
                img_color[row][col][2]=255
            elif I_gray>=64 and I_gray<128:  # (64-128)
                img_color[row][col][0] = 0
                img_color[row][col][1] = 255
                img_color[row][col][2] = (128-I_gray)*4-1
            elif I_gray>=128 and I_gray<192:  # (64-192)
                img_color[row][col][0] = (I_gray-128)*4
                img_color[row][col][1] = 255
                img_color[row][col][2] = 0
            else:  # (192-255)
                img_color[row][col][0] = 255
                img_color[row][col][1] = (192-I_gray)*4-1
                img_color[row][col][2] = 0

    return img_color

3.频率域彩色变换

通过滤波器划分三个频域,通过直方图均衡化后,映射到RGB颜色区域

#理想滤波器
def filter(img,mode,radius,radius2=None):
    """
    理想滤波器(mask生成器)
    :param img: 输入图像(频率域)
    :param mode: low_pass:低通 / high_pass:高通 / band_pass 带通
    :param radius: 带通内径/高低通半径
    :param radius2: 带通外径
    :return: filter/mask
    """
    w,h = img.shape[:2]
    mid_row = w//2
    mid_col = h//2 #中心点
    filter = np.ones((w,h),dtype=np.uint8)
    if mode=='low_pass':
        for row in range(w):
            for col in range(h):
                distance = (np.sqrt((mid_row-row)**2+(mid_col-col)**2))
                if distance<=radius:
                    filter[row][col] = 1
                else:
                    filter[row][col] = 0
        return filter
    elif mode=='high_pass':
        for row in range(w):
            for col in range(h):
                distance = (np.sqrt((mid_row-row)**2+(mid_col-col)**2))
                if distance<=radius:
                    filter[row][col] = 0
                else:
                    filter[row][col] = 1
        return filter
    elif mode == 'band_pass':
        for row in range(w):
            for col in range(h):
                distance = (np.sqrt((mid_row-row)**2+(mid_col-col)**2))
                if distance>=radius and distance<=radius2:
                    filter[row][col] = 1
                else:
                    filter[row][col] = 0
        return filter ##

def frequency_transform(img,radius,radius2):
    """
    频率域变换颜色
    :param img: 输入灰度图像
    :param radius: 滤波器内径(带通滤波器high)
    :param radius2: 滤波器外径(带通滤波器low)
    :return: 伪彩色增强图像(ndim=3)
    """
    img = np.float32(img)
    w,h = img.shape
    img_dft = cv.dft(img,flags=cv.DFT_COMPLEX_OUTPUT)
    img_dft_shift = np.fft.fftshift(img_dft)
    """生成滤波器"""
    filter_low_pass = filter(img,"low_pass",radius=radius)
    filter_band_pass = filter(img,"band_pass",radius=radius,radius2=radius2)
    filter_high_pass = filter(img,"high_pass",radius=radius2)
    """增加滤波器的维度(复制二维升三维)"""
    filter_low_pass = np.expand_dims(filter_low_pass,2).repeat(2,2)
    filter_band_pass = np.expand_dims(filter_band_pass, 2).repeat(2, 2)
    filter_high_pass = np.expand_dims(filter_high_pass, 2).repeat(2, 2)
    """滤波为三个频率分量"""
    img_dft_low = filter_low_pass * img_dft_shift
    img_dft_band = filter_band_pass * img_dft_shift
    img_dft_high = filter_high_pass * img_dft_shift
    """ishift"""
    img_dft_low_ishift = np.fft.ifftshift(img_dft_low)
    img_dft_band_ishift = np.fft.ifftshift(img_dft_band)
    img_dft_high_ishift = np.fft.ifftshift(img_dft_high)
    """idft"""
    img_idft_low = cv.idft(img_dft_low_ishift)
    img_idft_band = cv.idft(img_dft_band_ishift)
    img_idft_high = cv.idft(img_dft_high_ishift)
    """各个频率映射到RGB颜色"""
    img_low = cv.magnitude(img_idft_low[:,:,0],img_idft_low[:,:,1])
    img_band = cv.magnitude(img_idft_band[:,:,0],img_idft_band[:,:,1])
    img_high = cv.magnitude(img_idft_high[:,:,0],img_idft_high[:,:,1])
    img_color = np.zeros((w,h,3),dtype=np.float32)
    img_color[:,:,0]= img_low
    img_color[:,:,1] = img_band
    img_color[:,:,2] = img_high

    """灰度直方图均衡化"""
    img_color = cv.convertScaleAbs(img_color)
    img_color_R = cv.equalizeHist(img_color[:,:,0]) #三通道分别直方图均衡化
    img_color_G = cv.equalizeHist(img_color[:,:,1])
    img_color_B = cv.equalizeHist(img_color[:,:,2])
    img_color_equal = cv.merge((img_color_R,img_color_G,img_color_B))
    return img_color_equal

4.处理结果

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

img = cv.imread("images/Brain.jpg")
img_gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

plt.figure("彩色增强")
plt.subplot(131);plt.title("灰度级转换RGB")
plt.imshow(color_enhence(img_gary));plt.axis('off');
plt.subplot(132);plt.title("强分层法")
plt.imshow(strong_layering(img_gary,8));plt.axis('off');
plt.subplot(133);plt.title("频率转RGB")
plt.imshow(frequency_transform(img_gary,10,20));plt.axis('off');
plt.show()

Python-图像-伪彩色图像处理_第4张图片

 

你可能感兴趣的:(Python-数字图像,python,计算机视觉,opencv)