从头开始study,每日积累!
图像都是由像素(pixel)构成的,图像通常包括二值图像、灰度图像和彩色图像。
1.二值图像
二值图像顾名思义,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。
2.灰度图像
灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:
(1) 浮点算法:Gray=R0.3+G0.59+B0.11
(2) 整数方法:Gray=(R30+G59+B11)/100
(3) 移位方法:Gray=(R28+G151+B77)>>8;
(4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
(5) 仅取绿色:Gray=G;
(6) 加权平均值算法:根据光的亮度特性,公式:R=G=B=R0.299+G*0.587+B0.144
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。改变象素矩阵的RGB值,来达到彩色图转变为灰度图。
例子
3.RGB图像
彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。
接下来是简单的opencv函数
1.读写图片
# -*- coding:utf-8 -*-
import cv2
#读取图片
img = cv2.imread("test.jpg")
#显示图像
cv2.imshow("Demo", img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
#写入图像
cv2.imwrite("testyxz.jpg", img)
窗口等待的时候,是wiatkey函数,键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。
2.像素处理
下面代码是获取像素及修改的部分代码。
#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
test = img[88,142]
print test
img[88,142] = [255, 255, 255]
print test
#分别获取BGR通道像素
blue = img[88,142,0]
print blue
green = img[88,142,1]
print green
red = img[88,142,2]
print red
下面代码是将行为100到200、列150到250的像素区域设置为白色。
# -*- coding:utf-8 -*-
import cv2
#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
#该区域设置为白色
img[100:200, 150:250] = [255,255,255]
#显示图像
cv2.imshow("Demo", img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
#写入图像
cv2.imwrite("testyxz.jpg", img)
3.传统读取像素方法和修改像素
import cv2
img=cv2.imread("C:/picture/timg.jpg")
#读取像素方法一
b=img[78,125,0]
print(b)
g=img[78,125,1]
print(g)
r=img[78,125,2]
print(r)
#方法二
bgr=img[78,125]
print(bgr)
#修改区域像素
img[100:200,400:500]=[20,250,0]#绿色
#窗口大小可以随意改变
cv2.namedWindow("jqy",cv2.WINDOW_NORMAL)
cv2.imshow("jqy",img)
cv2.waitKey(0)
4.numpy读取像素和修改像素
import cv2
import numpy
img=cv2.imread("C:/picture/timg.jpg")
#numpy读取像素方法一
blue=img.item(78,100,0)
green=img.item(78,100,1)
red=img.item(78,100,2)
print(blue)
print(green)
print(red)
#方法二
print(img[78,100])
#numpy修改像素
img.itemset((78,100,0),100)
img.itemset((78,100,1),100)
img.itemset((78,100,2),100)
print(img.item(78,100,0))
print(img.item(78,100,1))
print(img.item(78,100,2))
cv2.namedWindow("jqy",cv2.WINDOW_NORMAL)
cv2.imshow("jqy",img)
cv2.waitKey(0)
#cv2.destroyAllWindows()
5.获取通道属性
1.形状-shape
通过shape关键字获取图像的形状,返回包含行数、列数、通道数的元祖。其中灰度图像返回行数和列数,彩色图像返回行数、列数和通道数。
行rows、列cols、通道chn
import cv2
import numpy
img=cv2.imread("C:/picture/timg.jpg")
print(img.shape)
cv2.imshow("jqy",img)
cv2.waitKey(0)
2.像素数目-size
通过size关键字获取图像的像素数目,其中灰度图像返回行数 * 列数,彩色图像返回行数 * 列数 * 通道数。
print(img.size)
3.图像类型-dtype
通过dtype关键字获取图像的数据类型,通常返回uint8。
print(img.dtype)
6.获取感兴趣ROI区域
什么是ROI区域?
ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。被广泛应用于热点地图、人脸识别、图像分割等领域。
a.获取
import cv2
import numpy as np
img=cv2.imread("C:/picture/tp.jpg")
cv2.imshow("tp",img)
face=img[100:200,100:300]
cv2.imshow("face",face)
cv2.waitKey(0)
b.融合
将提取的部分融合在图片的左上角
face=img[100:200,50:150]
img[0:100,0:100]=face
cv2.imshow("tp",img)
两张不同的图片融合
face=img[100:200,50:150]
pic[0:100,0:100]=face
cv2.imshow("tp",pic)
7.图像通道处理
a.通道拆分
OpenCV读取的彩色图像由B、G、R三原色组成,可以通过下面代码获取不同的通道。
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
使用split()函数进行拆分
b,g,r=cv2.split(img)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
b.通道合并
图像通道合并主要调用merge()函数实现
m = cv2.merge([b, g, r])
cv2.imshow("Merge", m)
如果是按照rgb来合并
m=cv2.merge([r,g,b])
cv2.imshow("Merge",m)
合并的图片如下图所示
同时,可以提取图像的不同颜色,提取G颜色通道,R、B通道设置为0,则显示绿色。
rows,cols,chn=img.shape
b=np.zeros((rows,cols),dtype=img.dtype)
g=cv2.split(img)[1]
r=np.zeros((rows,cols),dtype=img.dtype)
m=cv2.merge([b,g,r])
cv2.imshow("Merge",m)
the end