目录
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通道图像:
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(