• 计算机视觉与模式识别实验1-1 图像的直方图平衡


    🧡🧡实验流程🧡🧡

    1.读入图像‘rice.png’,在一个窗口中显示灰度级n=64,128和256的图像直方图。

    在这里插入图片描述
    在这里插入图片描述

    2.调解图像灰度范围,观察变换后的图像及其直方图的变化。

    在这里插入图片描述

    3.分别对图像‘pout.tif’和‘tire.tif’进行直方图均衡化处理,比较处理前后图像及直方图分布的变化。

    在这里插入图片描述
    在这里插入图片描述

    4.读取一幅彩色图像,对RGB图像的每个通道进行直方图均衡化,对均衡化后进行重新合并成彩色图像,展示不同阶段的图像效果。另将RGB图像转换为HSV图像(rgb2hsv函数),分别对三分量的图像行直方图均衡化,最后合并成新的彩色图像,分析不同阶段的图像效果。

    如下图,对RGB三个颜色通道进行直方图均衡化后,图像的对比度得到了改善,灰度级的分布更加均匀。
    在这里插入图片描述
    在这里插入图片描述
    如下图,HSV模型是基于人类感知的颜色模型,HSV分别表示色相(Hue)、饱和度(Saturation)和明度(Value),对其均衡化后,增强了图像的对比度和色彩鲜艳度,使得图像更加清晰、生动
    在这里插入图片描述
    在这里插入图片描述

    5.自行设计程序实现图像的直方图均衡

    主要思路:
    1.统计原始图像的直方图
    2.计算直方图累积分布
    3.用累积分布函数作变换函数进行图像灰度变换
    在这里插入图片描述

    🧡🧡所有代码🧡🧡

    主要采用opencv库,这里的代码是用jupyter写的。

    """
        1-1、1-2 直方图显示、直方图灰度调节
    """
    image = cv2.imread('img/test1_rice.png', cv2.IMREAD_GRAYSCALE)
    
    plt.figure(figsize=(15, 12))
    
    # 显示原始图像和直方图
    plt.subplot(3, 3, 1)
    plt.imshow(image, cmap='gray')
    plt.title('Original Image', fontsize=18)
    plt.axis('off')
    
    for i, n in enumerate([64, 128, 256]):
        plt.subplot(3, 3, i + 4)
        plt.hist(image.ravel(), bins=n, range=[0, 256], color='b', alpha=0.5)
        plt.title('Histogram (n={})'.format(n), fontsize=18)
        plt.xlabel('Pixel Value', fontsize=16)
        plt.ylabel('Frequency', fontsize=16)
    
    # 使用imadjust函数进行灰度调节
    adjusted_image = cv2.convertScaleAbs(image, alpha=1.5, beta=20)
    
    # 显示调节后的图像和直方图
    plt.subplot(3, 3, 7)
    plt.imshow(adjusted_image, cmap='gray')
    plt.title('Adjusted Image', fontsize=18)
    plt.axis('off')
    
    plt.subplot(3, 3, 8)
    plt.hist(adjusted_image.ravel(), bins=256, range=[0, 256], color='b', alpha=0.5)
    plt.title('Adjusted Histogram', fontsize=18)
    plt.xlabel('Pixel Value', fontsize=16)
    plt.ylabel('Frequency', fontsize=16)
    
    plt.tight_layout()
    plt.show()
    
    """
        1-3 直方图均衡化
    """
    
    image_pout = cv2.imread('img/test1_pout.png', cv2.IMREAD_GRAYSCALE)
    image_tire = cv2.imread('img/test1_tire.png', cv2.IMREAD_GRAYSCALE)
    
    # 直方图均衡化处理
    equalized_pout = cv2.equalizeHist(image_pout)
    equalized_tire = cv2.equalizeHist(image_tire)
    
    # 绘制处理前后图像及直方图分布的变化
    plt.figure(figsize=(12, 8))
    
    # 原始图像及其直方图
    plt.subplot(2, 4, 1)
    plt.imshow(image_pout, cmap='gray')
    plt.title('Original Pout')
    plt.axis('off')
    
    plt.subplot(2, 4, 2)
    plt.hist(image_pout.ravel(), bins=256, range=[0, 256], color='b', alpha=0.5)
    plt.title('Histogram (Before)')
    plt.xlabel('Pixel Value')
    plt.ylabel('Frequency')
    
    plt.subplot(2, 4, 5)
    plt.imshow(image_tire, cmap='gray')
    plt.title('Original Tire')
    plt.axis('off')
    
    plt.subplot(2, 4, 6)
    plt.hist(image_tire.ravel(), bins=256, range=[0, 256], color='b', alpha=0.5)
    plt.title('Histogram (Before)')
    plt.xlabel('Pixel Value')
    plt.ylabel('Frequency')
    
    # 直方图均衡化后图像及其直方图
    plt.subplot(2, 4, 3)
    plt.imshow(equalized_pout, cmap='gray')
    plt.title('Equalized Pout')
    plt.axis('off')
    
    plt.subplot(2, 4, 4)
    plt.hist(equalized_pout.ravel(), bins=256, range=[0, 256], color='b', alpha=0.5)
    plt.title('Histogram (After)')
    plt.xlabel('Pixel Value')
    plt.ylabel('Frequency')
    
    plt.subplot(2, 4, 7)
    plt.imshow(equalized_tire, cmap='gray')
    plt.title('Equalized Tire')
    plt.axis('off')
    
    plt.subplot(2, 4, 8)
    plt.hist(equalized_tire.ravel(), bins=256, range=[0, 256], color='b', alpha=0.5)
    plt.title('Histogram (After)')
    plt.xlabel('Pixel Value')
    plt.ylabel('Frequency')
    
    plt.tight_layout()
    plt.show()
    
    """
        1-4 RGB和HSV均衡化
    """
    
    image = cv2.imread('img/test1_LenaRGB.tif')
    
    # 处理RGB图像
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # opencv是BGR,  imshow是RGB
    r_channel, g_channel, b_channel = cv2.split(image_rgb)
    r_equalized = cv2.equalizeHist(r_channel)
    g_equalized = cv2.equalizeHist(g_channel)
    b_equalized = cv2.equalizeHist(b_channel)
    equalized_image = cv2.merge((r_equalized, g_equalized, b_equalized))
    
    plt.figure(figsize=(18, 20))
    
    plt.subplot(4, 2, 1)
    plt.imshow(image_rgb)
    plt.title('Original Channels', fontsize=18)
    plt.axis('off')
    
    plt.subplot(4, 2, 2)
    plt.imshow(cv2.merge((r_equalized, g_equalized, b_equalized)))
    plt.title('Equalized Channels', fontsize=18)
    plt.axis('off')
    
    plt.subplot(4, 2, 3)
    plt.hist(r_channel.ravel(), bins=256, range=[0, 256], color='r', alpha=0.5)
    plt.hist(g_channel.ravel(), bins=256, range=[0, 256], color='g', alpha=0.5)
    plt.hist(b_channel.ravel(), bins=256, range=[0, 256], color='b', alpha=0.5)
    plt.title('Histogram (Before Equalization)', fontsize=18)
    plt.xlabel('Pixel Value', fontsize=18)
    plt.ylabel('Frequency', fontsize=18)
    
    plt.subplot(4, 2, 4)
    plt.hist(r_equalized.ravel(), bins=256, range=[0, 256], color='r', alpha=0.5)
    plt.hist(g_equalized.ravel(), bins=256, range=[0, 256], color='g', alpha=0.5)
    plt.hist(b_equalized.ravel(), bins=256, range=[0, 256], color='b', alpha=0.5)
    plt.title('Histogram (After Equalization)', fontsize=18)
    plt.xlabel('Pixel Value', fontsize=18)
    plt.ylabel('Frequency', fontsize=18)
    
    # 处理HSV图像
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    h_channel, s_channel, v_channel = cv2.split(hsv_image)
    equalized_h_channel = cv2.equalizeHist(h_channel)
    equalized_s_channel = cv2.equalizeHist(s_channel)
    equalized_v_channel = cv2.equalizeHist(v_channel)
    equalized_hsv_image = cv2.merge((equalized_h_channel, equalized_s_channel, equalized_v_channel))
    equalized_rgb_image = cv2.cvtColor(equalized_hsv_image, cv2.COLOR_HSV2RGB)
    
    plt.subplot(4, 2, 5)
    plt.imshow(hsv_image)
    plt.title('Original HSV Channels', fontsize=18)
    plt.axis('off')
    
    plt.subplot(4, 2, 6)
    plt.imshow(equalized_rgb_image)
    plt.title('Equalized HSV Channels', fontsize=18)
    plt.axis('off')
    
    plt.subplot(4, 2, 7)
    plt.hist(h_channel.ravel(), bins=256, range=[0, 256], alpha=0.5)
    plt.hist(s_channel.ravel(), bins=256, range=[0, 256], alpha=0.5)
    plt.hist(v_channel.ravel(), bins=256, range=[0, 256], alpha=0.5)
    plt.title('Histogram (After Equalization)', fontsize=18)
    plt.xlabel('Pixel Value', fontsize=18)
    plt.ylabel('Frequency', fontsize=18)
    
    plt.subplot(4, 2, 8)
    plt.hist(equalized_h_channel.ravel(), bins=256, range=[0, 256], alpha=0.5)
    plt.hist(equalized_s_channel.ravel(), bins=256, range=[0, 256], alpha=0.5)
    plt.hist(equalized_v_channel.ravel(), bins=256, range=[0, 256], alpha=0.5)
    plt.title('Histogram (After Equalization)', fontsize=18)
    plt.xlabel('Pixel Value', fontsize=18)
    plt.ylabel('Frequency', fontsize=18)
    
    
    plt.tight_layout()
    plt.show()
    
    """
        1-5 手写直方图均衡化
    """
    
    #建立原始图像各灰度级的灰度值与像素个数对应表
    def Origin_histogram( img ):
    #     print(img.shape)
        histogram = {}
        for i in range( img.shape[0] ):
            for j in range( img.shape[1] ):
                k = img[i][j]
                if k in histogram:
                    histogram[k] += 1
                else:
                    histogram[k] = 1
                    
        sorted_histogram = {}#建立排好序的映射表
        sorted_list = sorted( histogram )#根据灰度值进行从低至高的排序
        
        for j in range( len( sorted_list ) ):
            sorted_histogram[ sorted_list[j] ] = histogram[ sorted_list[j] ]
    
        return sorted_histogram
    
    def equalization_histogram( histogram, img ):
    #     print(histogram)
        pr = {} #建立概率分布映射表
        for i in histogram.keys():
            pr[i] = histogram[i] / ( img.shape[0] * img.shape[1] ) 
    
        # 计算累计分布(变换函数)
        tmp = 0
        for m in pr.keys():
            tmp += pr[m]
            pr[m] =  max( histogram ) * tmp
    #     print(pr)
        
        # 将原图像每一点都进行变换
        new_img = np.zeros( shape = ( img.shape[0], img.shape[1] ), dtype = np.uint8 )
        for k in range( img.shape[0] ):
            for l in range( img.shape[1] ):
                new_img[k][l] = pr[img[k][l]]
    
        return new_img
    
    # 计算灰度直方图
    def GrayHist( img ):
        height, width = img.shape
        grayHist = np.zeros([256], np.uint64)
        for i in range(height):
            for j in range(width):
                grayHist[img[i][j]] += 1
        return grayHist
    
    img = cv2.imread( 'img/test1_pout.png', cv2.IMREAD_GRAYSCALE )
    # 计算原图灰度直方图
    origin_histogram = Origin_histogram( img )
    # 直方图均衡化
    new_img = equalization_histogram( origin_histogram, img )
    # 计算均衡化后的灰度直方图
    origin_grayHist = GrayHist(img)
    equaliza_grayHist = GrayHist( new_img )
    
    # 绘制灰度直方图
    x = np.arange(256)
    plt.figure(figsize=(15,10))
    plt.subplot( 2, 2, 1 )
    plt.plot(x, origin_grayHist, linewidth=2 , alpha=0.5)
    plt.title("Origin",fontsize=18)
    plt.ylabel("Frequency",fontsize=18)
    
    plt.subplot( 2, 2, 2 )
    plt.plot(x, equaliza_grayHist, linewidth=2, alpha=0.5)
    plt.title("Equalization",fontsize=18)
    plt.ylabel("Frequency",fontsize=18)
    
    plt.subplot( 2, 2, 3 )
    plt.imshow( img, cmap = plt.cm.gray )
    plt.title( 'Origin' ,fontsize=18)
    
    plt.subplot( 2, 2, 4 )
    plt.imshow( new_img, cmap = plt.cm.gray )
    plt.title( 'Equalization' ,fontsize=18)
    plt.show()
    
  • 相关阅读:
    怎样在小程序中直播
    JSD-2204-HTML-CSS-Day03
    子矩阵的前缀和(二维数组)
    利用canvas实现根据背景图片主色调动态展示字体颜色
    想学 fpga 开发该怎么入门?
    47、Flink 的 Data Source 原理
    uniapp微信小程序 提示消息 上传文件
    雷军卸任小米有品公司董事,仍持股70%;马斯克决定不加入推特董事会;一加10 Pro内核源代码公布|极客头条
    中国1km土壤特征数据集(2010年)
    随机森林知识点小总结
  • 原文地址:https://blog.csdn.net/luohaojia123/article/details/139362598