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颜色按一定关系映射

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()

 

  • 2
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV 中,可以通过 LUT(Look Up Table)和颜色映射函数来实现图像彩色处理。彩色处理是一种将灰度图像转换为彩色图像的方法,可以用于增强图像的可视化效果。 下面分别介绍 C++ 和 Python 两种实现方式: C++ 实现: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { // 读入灰度图像 Mat gray = imread("gray.png", IMREAD_GRAYSCALE); // 定义 LUT 表 Mat lut(1, 256, CV_8UC1); for (int i = 0; i < 256; i++) { if (i < 64) lut.at<uchar>(0, i) = 0; else if (i < 128) lut.at<uchar>(0, i) = (i - 64) * 4; else if (i < 192) lut.at<uchar>(0, i) = 255; else lut.at<uchar>(0, i) = 255 - (i - 192) * 4; } // 应用 LUT 表 Mat color; LUT(gray, lut, color); // 显示结果 imshow("Color", color); waitKey(0); return 0; } ``` 上述代码中,我们首先读入一张灰度图像,并定义了一个大小为 1x256 的 LUT 表。该表将灰度值映射到彩色值,其中灰度值在 0~63 之间的像素映射为黑色,灰度值在 64~127 之间的像素映射为蓝色,灰度值在 128~191 之间的像素映射为红色,灰度值在 192~255 之间的像素映射为黄色。 然后,我们调用 LUT 函数,将灰度图像应用到 LUT 表上,得到彩色图像。最后,我们将结果显示出来。 Python 实现: ```python import cv2 # 读入灰度图像 gray = cv2.imread("gray.png", cv2.IMREAD_GRAYSCALE) # 定义 LUT 表 lut = cv2.LUT(gray, None) for i in range(64): lut[i] = 0 for i in range(64, 128): lut[i] = (i - 64) * 4 for i in range(192, 256): lut[i] = 255 - (i - 192) * 4 for i in range(128, 192): lut[i] = 255 # 应用 LUT 表 color = cv2.applyColorMap(lut, cv2.COLORMAP_JET) # 显示结果 cv2.imshow("Color", color) cv2.waitKey(0) ``` 与 C++ 实现类似,我们首先读入灰度图像,并定义了一个与灰度图像相同大小的 LUT 表。然后,我们将灰度图像应用到 LUT 表上,并按照相应的颜色映射规则处理表中的像素值。最后,我们使用 applyColorMap 函数将处理后的 LUT 表转换为彩色图像,并显示结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值