图像处理100问python实现part1

本文介绍了Python图像处理的基础知识,包括图像的灰度化、二值化、大津二值化算法,以及各种滤波器如高斯、中值、差分滤波的应用。此外,还探讨了图像的HSV转换和减色处理,为后续的图像处理和分析打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.1原始图像1

原始图像

0.2加了噪声的图像

在这里插入图片描述

0.3 原始图像2

在这里插入图片描述

1.图像通道交换

读取图像,然后将 RGB通道替换成BGR 通道。
注意, cv2.imread() 的系数是按 BRG顺序排列的!

#python实现

import cv2
# function: RGB > BGR
def BGR2RGB(img):
    b = img[:, :, 0].copy()
    g = img[:, :, 1].copy()
    r = img[:, :, 2].copy()

    # RGB > BGR
    img[:, :, 0] = r
    img[:, :, 1] = g
    img[:, :, 2] = b

    return img


# Read image
img = cv2.imread("../imori.jpg")

# BGR -> RGB
img = BGR2RGB(img)

# Save result
cv2.imwrite("out.jpg", img)
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

BRG通道图像:

BGR通道图像

2.图像灰度化

灰度化是图像亮度的一种表示方法,灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0。灰度图相当于把亮度进行量化
使用灰度图的好处:
彩色图像单个像素是(R, G, B)
转换成灰度图就是(L),降低维度,简化矩阵, 提高运算速度.
灰度化的几种计算方法:
(1)TU-R BT.709
国际电信联盟(ITU)在1990年发布的高清数字视频标准,是 SDR(Standard Dynamic Range,标准动态范围)所使用的标准。计算公式如下:
Y = 0.2126\ R + 0.7152\ G + 0.0722\ B
(2)心理学灰度公式
将彩色图像的R、G、B三分量以不同的权重进行加权平均。人眼对绿色敏感最高,对蓝色敏感最低,故可采用心理学灰度公式:
Gray= 0.114B+ 0.587G+ 0.299R
(3)最大值法:将RGB三分量的最大值作为灰度值

#python实现
import cv2
import numpy as np

# Gray scale
def BGR2GRAY(img):
	b = img[:, :, 0].copy()
	g = img[:, :, 1].copy()
	r = img[:, :, 2].copy()

	# Gray scale
	out = 0.2126 * r + 0.7152 * g + 0.0722 * b
	#out = 0.299 * r + 0.587* g + 0.114* b #心理学灰度公式
	#out=max(r,max(g,b)) #最大值法
	out = out.astype(np.uint8)

	return out


# Read image
img = cv2.imread("imori.jpg").astype(np.float)

# Grayscale
out = BGR2GRAY(img)

# Save result
cv2.imwrite("out.jpg", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()

BT709灰度图像:

灰度图
心理学公式灰度图像:

心理学公式灰度图

3.图像二值化

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
需要设置一个阈值th来进行二值化,以th=128为例:
在这里插入图片描述
图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓

#python实现
import cv2
import numpy as np

# Gray scale
def BGR2GRAY(img):
    b = img[:, :, 0].copy()
    g = img[:, :, 1].copy()
    r = img[:, :, 2].copy()

    # Gray scale
    out = 0.2126 * r + 0.7152 * g + 0.0722 * b
    out = out.astype(np.uint8)

    return out

# binalization
def binarization(img, th=128):
    img[img < th] = 0
    img[img >= th] = 255
    return img
    
# Read image
img = cv2.imread("../1.jpg").astype(np.float32)

# Grayscale
out = BGR2GRAY(img)

# Binarization
out = binarization(out)

# Save result
cv2.imwrite("out1.jpg", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()

二值化图像:

在这里插入图片描述

4.大津二值化算法(OTSU)

OUST算法:
OTSU算法也称最大类间差法,有时也称之为大津算法,可以自动确定二值化阈值,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大。因此,使类间方差最大的分割意味着错分概率最小。
原理:
将每一个灰度值之上下之间的像素的方差求出来、找到方差最大的那个灰度值,那个就是我们想要的二值化分隔阈值。
在这里插入图片描述

import numpy as np
import cv2

# rgb图像灰度化
def GARY(img):
    b = img[:, :, 0].copy()
    g = img[:, :, 1].copy()
    r = img[:, :, 2].copy()
    out = 0.2126 * r + 0.7152 * g + 0.0722 * b
    return out

# OUST二值化
def OUST(img):
    max_t = 0
    max_s = 0

    # 遍历处理
    for t in range(1,255):
        n0 = out[np.where(out < t)]
        w0 = len(n0) / (H * W)
        m0 = np.mean(n0) if len(n0) > 0 else 0.
        n1 = out[np.where(out >= t)]
        w1 = len(n1) / (H * W)
        m1 = np.mean(n1) if len(n1) > 0 else 0.

        s = w0 * w1 * (m0 - m1) ** 2
        if s > max_s :
            max_s = s
            max_t = t
    # 二值化处理
    th=max_t
    print("阈值为:" , th)
    out[out < th] = 0
    out[out >= th] = 255
    return out

# 读取图像
img = cv2.imread("../1.jpg").astype(np.float32)
H, W, C=img.shape

out = GARY(img)
out = OUST(out)

#保存图像
cv2.imwrite("out1.jpg", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

5.色相HSV转换

6.减色处理算法

彩色图像由三通道组成,用8位无符号整型表示时颜色总256∗256∗256=16777216种,非常巨大,有时为了降低分析的复杂性会做减少颜色数量的处理。

Method1—利用整数除法特性
一种处理方法是将RGB空间细分到大小相等的方块中。例如,如果把每种颜色数量减少到1/8,那么颜色总数就变为32∗32∗32。将原图像中每个颜色值划分到一个方块,该方块的中间值就是新的颜色值;新图像使用新的颜色值,颜色数就变少了。

具体地,假设N是减色因子,将图像中每个像素的值除以N(使用整数除法,不保留余数。实际上,该算法就是利用了整数除法的特性来实现减色的)。然后将结果乘以N,得到N的倍数,再加上N/2,就得到相邻的N的倍数之间的中间值。对所有8位通道值重复这个过程,就会得到(256/N)∗(256/N)∗(256/N)种可能的颜色值。

例:令N=64 将图像的值由从256256256压缩到444,即RGB的值只取[32,96,160,224]
在这里插入图片描述

#N=64,从256*256*256压缩到4*4*4
import cv2 as cv
import numpy as np

def decrease_color(img,N):
    out = img.copy(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值