通道分离与合并、彩色图转换为灰度图、二值化
创始人
2024-03-31 02:21:48

文章目录

  • 图像基础
  • 重要的函数
  • 图像基本知识
    • 图像基础
    • 通道分离与合并
    • 彩色图转换为灰度图
    • 二值化
    • 图像的加减乘除

图像基础

  • 矩阵
  • 分辨率
  • 8位整型图像
  • 浮点数图像

现在简单介绍下二值化、灰度图以及真彩色和假彩色

  1. 图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化。
  2. 灰度图,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。用灰度表示的图像称作灰度图。除了常见的卫星图像、航空照片外,许多地球物理观测数据也以灰度表示。
  3. 真彩色是指在组成一幅彩色图像的每个像素值中,有R、G、B三个基色分量,每个基色分量直接决定显示设备的基色强度产生彩色。真彩色图像就是我们平时见到的可见光R、G、B,3个波段对应生成R、G、B3个通道的图像。
  4. 假彩色图像也是3通道的,但是它的3个通道不再是RGB3个波段的信息,而是用其他的波段来组成的3通道图像

在这里插入图片描述
灰度图:
在这里插入图片描述
彩色图:

在这里插入图片描述

对于彩色的图像的处理,主要包括:通道分离与合并、 彩色图转灰度图、二值化图像

  1. 通道分离与合并
b, g, r = cv.split(img)
img_new = cv.merge([b, g, r])
  1. 彩色图转灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  1. 二值化图像
_, img_bin = cv.threshold(img_gray, th1, th2, cv.THRESH_BINARY)

图像运算指以图像为单位进行的擦欧总、该操作对图像中的所有像素同样进行,运算的结果是一幅其灰度分布与原来参与运算图像灰度分布不同的新图像。具体的运算主要包括算术和逻辑运算,它们通过改变像素的值来得到图像增强的效果。

  1. 图像运算
img = cv.add(img1, img2)
img = cv.addWeighted(img1, alpha, img2, beta, gamma)
img = cv.subtract(img1, img2)
img = cv.multiply(img1, img2)
img = cv.divide(img1, img2)
  1. 图像像素非线性变换
img = cv.convertScaleAbs(img, alpha=1, beta=0)

s=b+krs = b + kr s=b+kr

s=a+ln(r+1)bs = a + \frac{ln(r+1)}{b} s=a+bln(r+1)​

s=crγs = cr^\gamma s=crγ

重要的函数

  1. 图像读取
img = cv.imread()
  1. 彩色图转灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  1. 二值化图像(灰度图转二值图)
_, img_bin = cv.threshold(img_gray, th1, th2, cv.THRESH_BINARY)
  1. 保存图像
cv.imwrite('pic/bear_gray.jpg', img_gray)
  1. 通道分离
b, g, r = cv.split(img)
  1. 通道合并
img_new = cv.merge([b, g, r])
  1. 两图像相加、相减、相乘、相除
img = cv.add(img1, img2)
img = cv.subtract(img1, img2)
img = cv.multiply(img1, img2)
img = cv.divide(img1, img2)

图像基本知识

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def show(img):if img.ndim == 2:plt.imshow(img, cmap='gray',vmin=0,vmax=255)else:plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))#cv用的BGR,需要转换为RGBplt.show()

图像基础

A = np.random.randint(0,256,(2,4))
A
array([[  4, 245, 223, 220],[191, 208, 190,  72]])
show(A)

在这里插入图片描述

B = np.random.randint(0,256,(2,4,3),dtype=np.uint8)
B
array([[[240,  57,  37],[141,  33, 113],[ 50, 252,   5],[125,  23, 206]],[[ 94, 128, 166],[218, 183, 231],[156, 136, 105],[208, 191, 119]]], dtype=uint8)

uint8为8位无符号整数类型,表示范围为[0, 255]

show(B)

在这里插入图片描述

A2 = np.float32(A)
A2 /= 255
show(A2)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IreIgOD4-1662470402352)(output_13_0.png)]

通道分离与合并

读取图片

img = cv.imread('./pic/cubic500x500.jpg')
show(img)

在这里插入图片描述

通道分离

b,g,r = cv.split(img)
show(r)

在这里插入图片描述

img.shape
(500, 500, 3)

通道合并

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

在这里插入图片描述

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

在这里插入图片描述

彩色图转换为灰度图

将三个通道进行加权

gray1 = 1/3*b + 1/3*g + 1/3*r
gray1 = np.uint8(gray1)# 或者gray1 = gray1.astype(np.uint8)

利用cv现成的api

gray4 = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
show(gray4)

在这里插入图片描述

二值化

thresh = 125
gray4[gray4 > thresh] = 255
gray4[gray4 <= thresh] = 0
show(gray4)

在这里插入图片描述

利用cv.threshold来进行二值化

show(gray1)

在这里插入图片描述

_, img_bin = cv.threshold(gray1, 125, 255, cv.THRESH_BINARY)
show(img_bin)

在这里插入图片描述

图像的加减乘除

  • 相加:混合图像、添加噪声cv.add()

  • 相减:消除背景、差影法(比较差异、运动跟踪)cv.subtract()

  • 相乘:掩膜 cv.multiply()

  • 相除:校正设备、比较差异 cv.divide()

np.hstack将参数元组的元素数组按水平方向进行叠加

np.vstack将参数元组的元素数组按垂直方向进行叠加

接下来,我们进行代码的实现

obj = cv.imread('./pic/hedgehog500x500.jpg',0)
bg = cv.imread('./pic/line500x500.jpg',0)
mask = cv.imread('./pic/mask500x500.jpg',0)
noise = cv.imread('./pic/hedgehog_noise_500x500.jpg',0)
show(np.hstack([obj,bg,mask,noise]))

在这里插入图片描述

接下来,我们呢可以图像相加以及图像相减的效果:

图像相加:

img_add = obj + bg
show(img_add)

在这里插入图片描述

显然得到的图,并不是我们想要的,这是因为img_add = obj + bg,两个图的RGB元素相加超过了255时,会重新循环到另外一个值,我们只需要两者都取权重0.5,就可以避免这样的问题

img_add = obj*0.5 + bg*0.5 #img_add = cv.add(obj*0.5,bg*0.5)
show(img_add)

在这里插入图片描述

print(img_add.dtype)
float64

但是这里注意,obj0.5 + bg0.5后,img_add的数据类型会自动转换为float类型,你也可以使用np.uint8()进行强制转换

但是,调用cv.addWeighted(),就不会出现这样的情况,它会自动的截断

img_add2 = cv.addWeighted(obj,0.5,bg,0.5,0)
show(img_add2)

在这里插入图片描述

图像相减:

img_sub = np.uint8((img_add - bg*0.5))
#img_sub = cv.subtract(img_add,bg*0.5)
show(np.hstack([img_sub,img_sub*2]))

在这里插入图片描述

图像乘法

# mask /= 255
show(np.hstack([obj, mask]))

在这里插入图片描述

img_mul = cv.multiply(obj/1.0, mask/255) #cv.multiply只会对同种类型的数据相乘,因此Ob/1.0
show(img_mul) 

在这里插入图片描述

图像相除

# 图像相除
show(np.hstack([obj, ob_noise]))

在这里插入图片描述

img_div = cv.divide(obj, ob_noise+1)
show(img_div)

在这里插入图片描述

保存图片

cv.imwrite('pic/img_divide.jpg', np.hstack([obj, noise, img_div]))
True
# 实例
bg = cv.imread('pic/petal500x500.jpg')
ob = cv.imread('pic/hedgehog500x500.jpg')
mask = cv.imread('pic/mask500x500.jpg')show(np.hstack([bg, ob, mask]))

在这里插入图片描述

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

在这里插入图片描述

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)
cv.imwrite('pic/image_mix.jpg', np.hstack([bg, ob, nice]))
True

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...