您现在的位置是:首页 >技术杂谈 >python图像处理实战(二)—二值化图像与线性变换网站首页技术杂谈

python图像处理实战(二)—二值化图像与线性变换

那个叫马尔的大夫 2024-07-09 10:33:08
简介python图像处理实战(二)—二值化图像与线性变换

?写在前面?

?个人主页:https://blog.csdn.net/m0_52051577?type=blog 

?欢迎各位大佬支持点赞收藏,三连必回!!

?本人新开系列专栏—python图像处理

❀愿每一个骤雨初晴之时,所有的蜻蜓振翅和雨后惊雷,都归你。

前言

        首先引入以下灰度变换的概念。

        灰度变换是指根据某种目标条件按一定变换关系逐点改变源图像中每一个像素灰度值的方法。目的是 为了改善画质,使图像的显示效果更加清晰。 图像的灰度变换处理是图像增强处理技术中的一种非常基础、直接的空间域图像处理方法,也是图像数字化软件和图像显示软件的一个重要组成部分。——来自百度百科

        这里采用opencv中的二值化相关方法进行灰度处理,进行灰度变换的非线性变换。

目录

一、所需函数

二、图像基本知识

1、自定义图像

 2、三种常见图像相互转换

3、通道分离与合并 

三、图像运算

 四、实例


 注:本文涉及到的图片资源可在博客积分资源中获取,相关链接:https://download.csdn.net/download/m0_52051577/87844285?spm=1001.2014.3001.5503

一、所需函数

## 1. 图像读取
img = cv.imread()

## 2. 彩色图转灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

## 3. 二值化图像(灰度图转二值图)
_, img_bin = cv.threshold(img_gray, th1, th2, cv.THRESH_BINARY)

## 4. 保存图像
cv.imwrite('pic/bear_gray.jpg', img_gray)

## 5. 通道分离
b, g, r = cv.split(img)

## 6. 通道合并
img_new = cv.merge([b, g, r])

## 7. 两图像相加、相减、相乘、相除
img = cv.add(img1, img2)
img = cv.subtract(img1, img2)
img = cv.multiply(img1, img2)
img = cv.divide(img1, img2)

二、图像基本知识

1、自定义图像

b = np.array([
    [0, 127, 255],
    [255, 0, 255],
    [10, 50, 100]
], dtype=np.uint8)

g = b.T
r = b - g

# show(b)
show(cv.merge([b, g, r]))

# cv.imwrite()

 

注:其中,b矩阵中的三个行向量分别表示纯色图像,其中0表示纯黑,255表示纯白。g表示b的转置矩阵,r则是将b与g矩阵对应元素相减,最后再用merge函数将b,g,r三个单通道的纯色图像合并成一张真彩色三通道图像。 

RGB颜色对照表链接:RGB颜色对照表

 2、三种常见图像相互转换

首先预先定义函数。 若图片的维度为2,即灰度图,则读取并展示图片;若不为灰度图,即彩色图,则采用cvtColor()函数进行色彩空间的转换。

def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.show()
# 读取彩色图
img = cv.imread('pic/bear500x333.jpg')
# print(img)
show(img)

 

# 读取灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
show(img_gray)

 

如图,已经将彩色图进行灰度处理。 

# 二值化图像
_, img_bin = cv.threshold(img_gray, 150, 255, cv.THRESH_BINARY)
show(img_bin)

 如图,将灰度图二值化处理,其中设定的值为150和255。该函数根据原图像的像素点分布占比对图像根据设定的值进行二值化。

# 保存图像
cv.imwrite('pic/apple_gray.jpg', img_gray)
cv.imwrite('pic/apple_bin.jpg', img_bin)

3、通道分离与合并 

 该部分涉及到cv库中的split()函数,该函数用于将多通道图像分离成单通道图像,即将三通道的彩色图分离成三个单通道的纯色图。

# 分离BGR通道

# r = img[:,:,0]
b, g, r = cv.split(img)
# b.shape
#show(b)
#show(g)
show(r)

 

如图,从左到右依次为b,g,r对应的单通道图像。倘若我们将b,g,r重新合并,则可将图像还原为原彩色图。

# 合并BGR通道
img_new = cv.merge([b, g, r])
show(img_new)

 

 此外,还可将原彩色图中的r,g,b三个色彩通道按自定义的权重进行重新调整,将其转化为灰度图。如下所示:

# rgb转灰度图
img_gray2 = 0.114*b + 0.587*g + 0.299*r
# img_gray2 = (0.299*r + 0.587*g + 0.114*b).astype(np.uint8)
show(img_gray2)

 

三、图像运算

该部分主要涉及图像的加减乘除处理。 

bg = cv.imread('D:\proclass\class\pic\background.jpg', 0)
ob = cv.imread('D:\proclass\class\pic\computer500x500.jpg', 0)
show(np.hstack([bg, ob]))

 

注:将两个图像用hstack()函数实现水平方向的拼接,但要求两个图像的维度必须一致。 具体可用shape()函数对图像的维度进行检查。

# 图像相加
# img_add = cv.add(bg*0.5, ob*0.5)
img_add = bg * 0.5 + ob * 0.5
show(img_add)

将两张图片按定义的权重进行相加处理,也可采用cv中的add()函数。 相加主要用于混合图像和添加噪声。

# 图像相减
# img_sub = img_add - bg * 0.5
img_sub = cv.subtract(img_add, bg * 0.5)
show(img_sub)

 

同理,对两张图像进行相减操作。 用来消除背景或者比较差异。

# 图像相乘
mask = cv.imread('D:\proclass\class\pic\mask500x500.jpg', 0)
# mask /= 255
# show(mask)
show(np.hstack([ob, mask]))
img_mul = cv.multiply(ob/1.0, mask/255)
show(img_mul)

 

 进行相乘处理,用来遮挡图像。

# 图像相除

ob_noise = cv.imread('D:\proclass\class\pic\hedgehog_noise_500x500.jpg', 0)
show(np.hstack([ob, ob_noise]))
img_div = cv.divide(ob, ob_noise+1)
show(img_div)

 

 其中,ob_noise为带噪声的图像,用来比较两张图中的差异。

 四、实例

第一步,读入图片。

bg = cv.imread('pic/petal500x500.jpg')
ob = cv.imread('pic/hedgehog500x500.jpg')
mask = cv.imread('pic/mask500x500.jpg')

show(np.hstack([bg, ob, mask]))

  

 第二步,用mask对第二张图片进行遮挡。

ob_select = np.float32(ob/1.0) * np.float32(mask/255.0)
show(np.uint8(ob_select))

 

 第三步,将mask图像的周围区域进行边缘处理,并用第一张图像对黑洞周围的区域进行填充。

bg_select = np.float32(bg/1.0) * np.float32(1-mask/255.0)
show(np.uint8(bg_select))

 

 第四步,将第二步处理后的图像与第三步处理后的图像按指定权重相加。从而实现图像的混合。

nice = cv.add(ob_select*0.8, bg_select).astype(np.uint8)
show(nice)

 

 

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。