[图像处理]图像美化

本文介绍了图像处理中的颜色直方图、直方图均衡化、高斯均值滤波和中值滤波四种常用方法。颜色直方图通过统计RGB分量分布来表征图像颜色特征;直方图均衡化通过灰度变换增强图像对比度;高斯滤波采用加权平均方式实现平滑去噪;中值滤波则通过邻域像素排序取中值的方式有效消除椒盐噪声。每种方法都给出了代码实现示例,并分析了其原理、特点和应用场景,这些技术为图像增强和预处理提供了重要手段。

1. 彩色直方图

颜色直方图,指的是一幅图像中的颜色分布,与图像中的特定的物体无关,只是用来表示人的眼睛观察到的图像中的颜色分布情况,例如说,一幅图中红色占了多少比例,绿色占了多少比例等。

我们知道,计算机色彩显示器采用R、G、B相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。在RGB颜色空间中,任意色光F都可以用RGB三色不同分量的相加混合而成。也就是说,图像中每个像素的颜色值都可以用一个三元值(R,G,B)来表示,例如(0,0,0)表示黑色,(0,0,255)表示蓝色,......每个分量的大小从0~255.

那么,我们可以知道一张彩色图像可以由R、G、B三个通道堆叠而成。可以想象成将三张大小相同的纸叠放,然后人眼从上往下看到的图像就是原来的彩色图像。这里,假设图像的分辨率为320*240,那么每个通道的长为320,宽为240,单位是像素,总的像素个数就是3*320*240.

python 复制代码
def image_histogram(image_path):
    """
    提取图像的直方图
    :param image: 图像路径
    :return: None
    """
    image = cv2.imread(image_path, 1)

    # method 1: matplotlib to get histogram
    plt.hist(image.ravel(), 256)
    plt.show()

    # method 2: use opencv to get histogram
    histb = cv2.calcHist([image], [0], None, [256], [0, 255])
    plt.plot(histb, color='b')
    plt.show()

2. 直方图均衡化

图像的空域处理是一种重要的图像处理技术,这类方法直接以图像的像素操作为基础,主要分为灰度变换和空域滤波两大类,直方图均衡化(Histogram equalization)就是一种常用的灰度变换方法。通常,暗图像直方图的分量集中在灰度较低的一端,而亮图像直方图分量偏向于灰度较高的一端。

如果一幅图像的灰度直方图几乎覆盖了整个灰度的取值范围,并且除了个别灰度值的个数较为突出,整个灰度值分布近似于均匀分布,那么这幅图像就具有较大的灰度动态范围和较高的对比度,同时图像的细节更为丰富。已经证明,仅仅依靠输入图像的直方图信息,就可以得到一个变换函数,利用该变换函数可以将输入图像达到上述效果,该过程就是直方图均衡化

直方图均衡化就是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。直方图均衡化的中心思想是把原始图像的的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布。旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。

python 复制代码
def balance_img_his(image_path):
    """
    直方图均衡化:灰度直方图、彩色直方图、YUV直方图均衡化
    :return:
    """
    src_img = cv2.imread(image_path, 1)

    # 灰度直方图均衡化
    gray_img = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY)
    dist_img = cv2.equalizeHist(gray_img)

    img = cv2.cvtColor(gray_img, cv2.COLOR_BGR2RGB)
    dst = cv2.cvtColor(dist_img, cv2.COLOR_BGR2RGB)

    # # 彩色直方图均衡化
    # # 将图片分解成RGB 三通道,然后分别进行均衡化操作
    # b, g, r = cv2.split(src_img)
    # bH = cv2.equalizeHist(b)
    # gH = cv2.equalizeHist(g)
    # rH = cv2.equalizeHist(r)
    # # 合成均衡后的通道
    # dst = cv2.merge([bH, gH, rH])
    #
    # img = cv2.cvtColor(src_img, cv2.COLOR_BGR2RGB)
    # dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)

    # plt绘制前后两张图片显示效果
    # 原图显示
    plt.figure(figsize=(14, 9), dpi=100)  # 设置绘图区域的大小和像素

    plt.subplot(121)  # 一行两列第一个
    plt.imshow(img)
    # 灰度 直方图均衡化
    plt.subplot(122)  # 一行两列第二个
    plt.imshow(dst)
    plt.show()

3. 高斯均值滤波

滤波 :是信号和图像处理中基本的任务。其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息。过滤可以移除图像中的噪音、提取感兴趣的可视特征、允许图像重采样等等。频域分析 :将图像分成从低频到高频的不同部分。低频对应图像强度变化小的区域,而高频是图像强度变化非常大的区域。

在频率分析领域的框架中,滤波器是一个用来增强图像中某个波段或频率并阻塞(或降低)其他频率波段的操作。低通滤波器是消除图像中高频部分,但保留低频部分。高通滤波器消除低频部分。滤波(高通、低通、带通、带阻) 、模糊、去噪、平滑等。高斯模糊实质上就是一种均值模糊,只是高斯模糊是按照加权平均的,距离越近的点权重越大,距离越远的点权重越小。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

python 复制代码
def gauss_filter(image_path):
    src_img = cv2.imread(image_path, 1)
    dst_img = cv2.GaussianBlur(src_img, (5, 5), 1.5)

    src = cv2.cvtColor(src_img,cv2.COLOR_BGR2RGB)
    dst = cv2.cvtColor(dst_img, cv2.COLOR_BGR2RGB)

    plt.figure(figsize=(14, 6), dpi=100)

    plt.subplot(121)
    plt.imshow(src)

    plt.subplot(122)
    plt.imshow(dst)

    plt.show()

4. 中值滤波

4.1 中值滤波原理

中值滤波基于排序统计理论,通过将每个像素点的灰度值替换为其邻域内所有像素点灰度值的中值,从而达到消除孤立噪声点的目的。这种方法能够让周围的像素值接近真实值,从而在消除噪声的同时保持图像的边缘特性,避免产生显著的模糊。

4.2 中值滤波的应用

中值滤波在图像处理领域具有广泛的应用,尤其适用于消除椒盐噪声和脉冲噪声。由于其对孤立噪声点的有效抑制,中值滤波在图像预处理阶段扮演着重要的角色。它可以帮助改善图像质量,为后续的图像分析和处理提供更好的基础。

4.3 中值滤波的实现方法

中值滤波一般采用模板的方法实现,通过在模板内对像素进行排序并选取中值来替代模板中心像素的值。具体实现步骤如下:

  1. 定义一个移动窗口(模板),确保窗口内包含奇数个像素点。常用的窗口大小有3x3、5x5、7x7等。
  2. 将模板中心与图像中的某个像素位置重合。
  3. 读取模板下各对应的像素灰度值,并进行排序。排序可以采用从小到大或从大到小的顺序。
  4. 选取排序后的灰度序列的中值。
  5. 将中值赋给模板中心位置的像素,完成滤波操作。
python 复制代码
def middle_filter(image_path):

    img = cv2.imread(image_path, 1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # cv2.imshow('src',img)
    dst = np.zeros((height, width, 3), np.uint8)
    collect = np.zeros(9, np.uint8)
    for i in range(1, height - 1):
        for j in range(1, width - 1):
            k = 0
            for m in range(-1, 2):
                for n in range(-1, 2):
                    gray = img[i + m, j + n]
                    collect[k] = gray
                    k = k + 1
            # 0 1 2 3 4 5 6 7 8
            #   1
            for k in range(0, 9):
                p1 = collect[k]
                for t in range(k + 1, 9):
                    if p1:
                        mid = collect[t]
                        collect[t] = p1
                        p1 = mid
            dst[i, j] = collect[4]
    # cv2.imshow('dst',dst)
    # cv2.waitKey(0)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)
    plt.figure(figsize=(14, 6), dpi=100)  # 设置绘图区域的大小和像素
    plt.subplot(121)  # 一行二列第一个
    plt.imshow(img)
    plt.subplot(122)  # 一行二列第二个
    plt.imshow(dst)
    plt.show()
相关推荐
NAGNIP3 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab4 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab4 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP8 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年8 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼8 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS8 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区9 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈9 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang10 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx