OpenCV 1~4 图像处理、图像运算、类型转换、几何变换
1 图像处理
1.1 图像处理
import cv2
- 读入图像
retval = cv2.imread(文件名[,显示控制参数])
文件名:文件路径,
显示控制参数:cv.IMREAD_UNCHANGED(原图);cv.IMREAD_GRAYSCALE(灰度图);cv.IMREAD_COLOR(彩色) - 显示图像
img = cv2.imshow(窗口名,图像名)
cv2.waitKey([,delay]) # delay>0 等待delay毫秒;delay<0 等待键盘单击;delay=0 无限等待;
cv2.destryAllWindows() # 销毁 - 保存图像
img = cv2.imread(文件地址,文件名)
# Test
import cv2
img = cv2.imread('')
cv2.imshow('demo',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('',img)
- 图像由像素构成,像素越多,图像月清晰
- 图像分类:二值图[0,1];灰度图[0255];BGR图像[0255,0255,0255]
- 读取像素: 返回值=图像(位置参数);灰度图像返回灰度值p=img[89,120];彩色图像返回BGR三个颜色B,G,R = img(89,120,:);B = img(89,120,0);G = img(89,120,1); R = img(89,120,2)
- 修改像素:灰度图像:img[89,120]= 100;彩色图像修改像素mg(89,120)=[100,100,100];img(89,120,0)=100; img(89,120,1)=100; img(89,120,2)=100
import cv2
img = cv.imread('路径',1) # 彩色
img = cv.imread('路径',0) # 灰色
img = cv.imread('路径',-1) # 透明
p = img[100,100]
print(p)
img[100,100] = 255
print(p)
img1 = cv2.imread('',1)
p1 = img[100,100]
print(p1)
cv2.imshow('demo',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
img1[100,100,0] = [255,255,255]
img1[100,100,1] = 255
img1[100,100,2] = 255
print(p1)
img1[100:200,100:300] = [255,255,255]
cv2.imshow('demo',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 使用numpy访问像素
- 读取像素: 返回值=图像.item(位置参数)(位置参数)
- 修改像素: 图像.itemset(位置,新值)
## 灰度图像
import cv2
img1 = cv2.imread('地址')
p = img1.item(100,120) # 读取像素
print(p)
img1.itemset((100,120),255) 修改像素
print(p)
## 彩色图像
import cv2
img2 = cv2.imread('灰度')
b,g,r = img1.item(100,120) # 读取像素
print(b,g,r)
b1 = img2.itemset((100,120,0),255)
g1 = img2.itemset((100,120,1),255)
r1 = img2.itemset((100,120,2),255)
print(b1,g1,r1)
## 彩色图像转灰度图像
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
## 灰度图像转二值图像
_,img_bin = cv.threshold(img_gray ,th1, th2, cv.THRESH_BINARY)
## 彩色图像转灰度图像,灰度图像转二值图像
import cv2
import numpy as np
a = np.random.randint(0,255,[10,10,3],dtype=np.uint8)
a_gray = cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
_,a_bin = cv2.threshold(a_gray ,180, 200, cv2.THRESH_BINARY)
1.3 获取图像属性
- 形状:获取行列通道
- 像素数目
- 像素数据类型
## 灰度图像
import cv2
img1 = cv2.imread('灰度')
img1.shape # 形状
img1.size # 像素数目(h*w)
img1.dtype # 像素数据类型uint8
## 彩色图像
import cv2
img2 = cv2.imread('灰度')
img2.shape
img2.size # (h*w*c)
img2.dtype # uint8
1.4 感兴趣区域ROI
ROI(region of interest):感兴趣区域
# 通过下标获取感兴趣区域
import cv2
import numpy
img = cv2.imread('')
ROI = np.ones((101,101,3))
cv2.imshow('demo',img)
ROI = img[200:400,200:400]
cv2.imshow('ROI',ROI)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 把一个图像的感兴趣区域赋值到另外一张图片上
import cv2
import numpy
img1 = cv2.imread('')
img2 = cv2.imread('')
face = np.ones((101,101,3))
cv2.imshow('demo',img1)
ROI = img1[300:400,300:400]
img2[0:100,0:100] = ROI
cv2.imshow('ROI',ROI)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.5 通道的拆分与合并
- 通道的拆分 b,g,r = cv2.split(img)
- 通道的合并 bgr = cv2.merge([b,g,r]);rgb = cv2.merge([r,g,b])
# 1. 通道的拆分
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('')
a = np.random.randint(0,255,[10,10,3],dtype=np.uint8)
cv2.imwrite('./Desktop/a.png',a)
plt.imshow(a)
## 拆分1
b = img1[:,:,0]
g = img1[:,:,1]
r = img1[:,:,2]
## 拆分2
b1,g1,r1 = cv2.split(img)
cv2.imshow('b1',b1)
cv2.imshow('g1',g1)
cv2.imshow('r1',r1)
cv2.waitKey(0)
cv2.destroyAllWindows()
## 拆分部分通道
b1 = cv2.split(img)[0]
r1 = cv2.split(img)[1]
r1 = cv2.split(img)[2]
# 2. 通道的合并
bgr = cv2.merge([b,g,r])
cv2.imshow('bgr',bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
2 图像运算
2.1 图像加减乘除运算
- 结果图像 = 图像1 + 图像2; img = img1 + img2
- Numpy加法(取模): if 结果<=255: 结果=(img1 + img2);else:结果=(img1 + img2) % 255
- OpenCV加法:cv2.add(img1,img2) # if 结果<=255: 结果=(img1 + img2);else:结果 = 255
- 图像1 、图像2的shape必须一致。
- img = cv2.add(img1, img2)
- img = cv2.subtract(img1, img2)
- img = cv2.multiply(img1, img2)
- img = cv2.divide(img1, img2)
# 1. Numpy加法 更黑
import cv2
import numpy
img1 = cv2.imread('')
img2 = cv2.imread('')
r1 = img1+img2
cv2.imshow('r1',r1)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 2. OpenCV加法 混合图像,加噪声,添加背景
import cv2
import numpy
img1 = cv2.imread('')
img2 = cv2.imread('')
r2 = cv2.add(img1,img2)
img = cv.addWeighted(img1, 0.5,img2, 0.5,0)
cv2.imshow('r2',r2)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 3. 减法 判断两个图片是否相近,消除差异,去掉背景
a = np.random.randint(0,255,[10,10,3],dtype=np.uint8)
b = np.random.randint(0,255,[10,10,3],dtype=np.uint8)
a_b = cv2.subtract(a,b)
# 4. 乘法 (掩码*图片)
a = a / 255
a = a.astype(np.uint8)
a[4:7,4;7,:]=1
ab = cv2.multiply(a,b)
ab_ = cv2.multiply((1-a),b)
# 5. 除法 ,比较差异
ab = cv2.divide(a,b)
# 融合
ab = cv2.addWeighted(a,1,b,1,0)
# 图像像素非线性变换
img = cv2.convertScaleAbs(img, alpha=1, beta=0)
s(x,y) = c+kr(x,y)
s = a + \frac{ln(r+1)}{blnc}
s = cr^\gamma ; gamma = 0.5,1,1.5
2.2 图像融合
- 将2张或2张以上的图片信息融合到一张图像上.
- 结果图像 = 图像1系数1 + 图像2系数2 + 亮度调节
- img = img10.3 + img20.7 + 18
- addWeighted : dst =cv2.addWeighted(src1,alpha,src2,beta,gamma);
- dst = src1alpha+src2beta+gamma(gamma不能省略)
import cv2
img1 = cv2.imread('')
img2 = cv2.imread('')
dst =cv2.addWeighted(img1,1,img2,1,0)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
3 类型转换
3.1 类型转换
将图像由一种类型转换成另一种类型。
- cv2.COLOR_BGR2GRAY
- cv2.COLOR_BGR2RGB
- cv2.COLOR_GRAY2BGR
- 图像二值化
(1)彩色转换成灰度图
# 彩色转换成灰度图
import cv2
img1 = cv2.imread('')
img2 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
cv2.imshow('color',img1)
cv2.imshow('gray',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)BGR2RGB
# BGR2RGB
import cv2
img1 = cv2.imread('')
img2 = cv2.cvtColor(img1,cv2.BGR2RGB)
cv2.imshow('BGR',img1)
cv2.imshow('RGB',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3)GRAY2BGR
# GRAY2BGR 灰度转换成彩色之后,三个通道的颜色一样。
import cv2
img1 = cv2.imread('')
img2 = cv2.cvtColor(img1,cv2.GRAY2BGR)
cv2.imshow('GRAY',img1)
cv2.imshow('BGR',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
(4)二值化
import cv2
import numpy as np
import matplotlib.pyplot as plt
img_gray = cv2.imread('',0)
img_col = cv2.imread('',1)
img_tra = cv2.imread('',-1)
img_col = cv2.cvtColor(img_col,cv2.COLOR_BGR2RGB)
img_gray.shape,img_col.shape,img_tra.shape
plt.imshow(img_col)
plt.imshow(img_gray)
plt.imshow(img_tra)
_, img_bin = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
plt.imshow(img_bin)
3.2 图像像素非线性变换
- img = cv.convertScaleAbs(img, alpha=1, beta=0)
s = b + kr
s = a + \frac{ln(r+1)}{b}
s = cr^\gamma
(1)img = cv2.convertScaleAbs(img, alpha=2, beta=0)
# img = cv2.convertScaleAbs(img, alpha=1, beta=0)
import cv2
img1 = cv2.imread('') # 1. 图像读取
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 2. 彩色图转灰度图
_, img_bin = cv.threshold(img_gray, th1, th2, cv2.THRESH_BINARY) # 3. 二值化图像
img = cv2.convertScaleAbs(img, alpha=2, beta=0) #
cv2.imwrite('pic/bear_gray.jpg', img_gray) # 4. 保存图像
4 几何变换
4.1 图像放缩
- dst = cv2.resize(src,dsize[,dst[,fx[,fy[,interpolation]]]])
- dst = cv2.resize(img,dsize = (100,100))
- dst = cv2.resize(img,None,fx=0.5,fy=0.5) # 水平和垂直方向的缩放
- INTER_NEAREST,INTER_LINEAR
(1)设置新图片大小
# 用resize放缩
import cv2
img1 = cv2.imread('')
img2 = cv2.resize(img2,(100,100)) # col,row
cv2.imshow('img1',img1)
cv2.imshow('mg2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)用fx,fy放缩
# 用fx,fy放缩
import cv2
img1 = cv2.imread('')
img2 = cv2.resize(img2,None,fx=0.5,fy=0.5) # col,row
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3)最近邻插值实现放缩
1.shape=[h,w],shape_new=[h1,w1],img_new,img_new[i,j]=img[int(i*(h/h1)),int(j*(w/w1))]
# 用fx,fy放缩
import cv2
img = cv2.imread('')
h,w,d = img.shape
img_new = np.zeros([h1,w1,d],np.uint8)
h1,w1,_ = img_new.shape
for i in range(h1):
for j in range(w1):
img_new[i,j] = img[int(i*(h*1.0/h1)),int(j*(w*1.0/w1))]
cv2.imshow('img',img)
cv2.imshow('img_new',img_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
(4)双线性插值法实现放缩
1.shape=[h,w],shape_new=[h1,w1],img_new,img_new[i,j]=img[int(i*(h/h1)),int(j*(w/w1))]
'''
6 6.3 7
7
7.8
8
'''
import cv2
img = cv2.imread('')
h,w,d = img.shape
img_new = np.zeros([h1,w1,d],np.uint8)
h1,w1,_ = img_new.shape
for i in range(h1):
for j in range(w1):
i_new = np.round(i*(h*1.0/h1),1) # 6.3,7.8
j_new = np.round(j*(w*1.0/w1),1)
i_new1,i_new2 = str(i_new).split('.')
j_new1,j_new2 = str(i_new).split('.')
i_new1 = np.int8(i_new1)
i_new2 = np.int8(i_new2)
j_new1 = np.int8(j_new1)
j_new2 = np.int8(j_new2)
img_11 = img[i_new1,j_new1]
img_12 = img[i_new1+1,j_new1]
img_21 = img[i_new1,j_new1+1]
img_22 = img[i_new1+1,j_new1+1]
r1 = img_11*(1-i_new2*0.1) + img_12*(i_new2*0.1)
r2 = img_21*(1-i_new2*0.1) + img_22*(i_new2*0.1)
r = r1*(1-j_new2*0.1) + r2*(j_new2*0.1)
img_new[i,j] = r
cv2.imshow('img',img)
cv2.imshow('img_new',img_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
(5)仿射实现放缩
import cv2
import numpy as np
from matplotlib.pyplot as plt
img = cv2.imread('',1)
cv2.imshow('img',img)
heigh ,width,_= img.shape
matScale = np.float32([[0.5,0,0],[0,0.5,0]])
dst = cv2.warpAffine(img,matScale,(int(heigh/2),int(width/2)))
plt.show(dst)
4.2 图像翻转
dst = cv2.flip(src,flipCode) # flipCode:1 (== 0) 以x轴反转;(> 0)2 以x轴反转;3 (< 0)先以x轴反转,再以x轴反转;
(1) 上下翻转
'''
𝑥=𝑥0
y = fH-y0
x -1 0 fw x0
y = 0 1 0 y0
1 0 0 1 1
'''
# 1 上下翻转
import cv2
img1 = cv2.imread('')
img2 = cv2.flip(img1,0)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)左右翻转
'''
𝑥=𝑓𝑊−𝑥0
𝑦=𝑦0
x -1 0 fw x0
y = 0 1 0 y0
1 0 0 1 1
'''
# 1 左右翻转
import cv2
img1 = cv2.imread('')
img2 = cv2.flip(img1,1)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3)先上下翻转,再左右翻转
'''
x =
y = fH-y0
x -1 0 fW x0
y = 0 -1 fH y0
1 0 0 1 1
'''
# 1 先上下翻转,再左右翻转
import cv2
img1 = cv2.imread('')
img2 = cv2.flip(img1,-1)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
(4) python实现图像翻转
import cv2
import numpy as np
import matplotlib.pyplot as plt
img2 = cv2.imread('./2.png')
img2.resize([266,266,3])
r,c,_= img2.shape
img_ = np.zeros_like(img2,dtype = np.uint8)
for j in range(c):
img_[:,j,:] = img2[:,c-1-j,:]
plt.show(img_)
(5) python实现图像镜像
import cv2
import numpy as np
import matplotlib.pyplot as plt
img2 = cv2.imread('./2.png')
r,c,_= img2.shape
img_ = np.zeros([r*2,c,3],dtype = np.uint8)
for i in range(r):
img_[i] = img2[i]
img_[r*2-1-i] = img2[i]
img_[r-1:r+2] = [255,255,255]
plt.show(img_)
(6) 通过仿射实现镜像
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./2.png')
mirrorM = np.array([
[-1, 0, 333],
[0, 1, 0]
], dtype=np.float32)
img_mirr = cv2.warpAffine(img, mirrorM, dsize=img.shape[:2][::-1])
plt.show(img_mirr)
4.3 图像平移
(1) 坐标平移
'''
x = x0 + dx
y = y0 + dy
x 1 0 dx x0
y = 0 1 dy * y0
1 0 0 1 1
'''
# 1 坐标平移
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.imread('1.png')
img1.shape
img1.resize([266,266,3])
img_ = np.zeros_like(img1,dtype = np.uint8)
img_[100:,100:,:] = img2[:166,:166,:]
plt.imshow(img_)
(2)用opencv函数实现图片位移
'''
1 移位矩阵
2 仿射变换
'''
import cv2 as cv
import numpy as np
img = cv.imread('',1)
cv.imshow('img',img)
r,c,_ = img.shape
matShift = np.float32([[1,0,100],[0,1,200]]) # 2*3 移位矩阵
dst = cv2.warpAffine(img,matShift,(600,600)) # 矩阵移位
cv2.imshow('dst',dst)
cv2.waitKey(3)
4.4 图像错切
(1) 水平错切
'''
# 水平错切
x = x0 + tan0*y0
x 1 tan0 0 x0
y = 0 1 0 * y0
1 0 0 1 1
# 垂直错切
y = y0 + tan0*x0
x 1 0 0 x0
y = tan0 1 0 * y0
1 0 0 1 1
'''
import cv2
import numpy as np
import matplotlib.pyplot as plt
img2 = cv2.imread('./2.png')
img2.resize([266,266,3])
r,c,_= img2.shape
theta = np.pi/4
t = np.tan(theta)
img_ = np.zeros_like(img2,dtype = np.uint8)
for i ,j in zip(range(r),range(c)):
x_ = int(i+j*t)
if r-x_ > 0:
img_[i,x_:,:] = img2[i,:r-x_ ,:]
plt.imshow(img_)
用opencv函数实现错切
```python
'''
x 1 tan0 0 x0
y = 0 1 0 * y0
1 0 0 1 1
'''
import cv2 as cv
import numpy as np
img = cv.imread('',1)
cv.imshow('img',img)
r,c,_ = img.shape
tan_0 = np.tan(np.pi/10)
matShift = np.float32([[1,tan_0,0],[0,1,0]]) # 2*3 移位矩阵
dst = cv2.warpAffine(img,matShift,(r,c)) # 矩阵移位
cv2.imshow('dst',dst)
cv2.waitKey(3)
(2) 垂直错切
import cv2
import numpy as np
import matplotlib.pyplot as plt
img2 = cv2.imread('./2.png')
r,c,_= img2.shape
theta = np.pi/4
t = np.tan(theta)
img_ = np.zeros_like(img2,dtype = np.uint8)
for i ,j in zip(range(r),range(c)):
y_ = int(j+i*t)
if c-y_ > 0:
img_[y_:,j,:] = img2[:c-y_ ,j,:]
plt.imshow(img_)
(3) 仿射错切
# 1水平错切
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('1.png')
tan0 = 0.01
transM = np.array([
[1, tan0, 0],
[0, 1, 0]
], dtype=np.float32)
img_trans = cv2.warpAffine(img, transM, dsize=(600, 600)) # transM:平移矩阵
dsize:平移后图片的新的宽高
plt.imshow(img_trans)
# 2 垂直错切
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('1.png')
tan0 = 0.01
transM = np.array([
[1, 0, 0],
[tan0, 1, 0]
], dtype=np.float32)
img_trans = cv2.warpAffine(img, transM, dsize=(600, 600)) # transM:平移矩阵
dsize:平移后图片的新的宽高
plt.imshow(img_trans)
4.4 图像旋转
'''
x cosb sinb 0 x0
y = -sinb cosb 0 * y0
1 0 0 1 1
'''
import cv2
import numpy as np
img2 = cv2.imread('./2.png',1)
heigh,width,_= img2.shape
matRotate = cv2.getRotationMatrix2D((heigh*0.5,width*0.5),45,0.5) # scale = 0.5
dst = cv2.warpAffine(img,matRotate,(heigh,width))
cv2.imshow('dst',dst)
cv2.waitKey(3)
4.5 透视变换
1. cv.getPerspectiveTransform()
import cv2
import numpy as np
img = cv2.imread('./2.png',1)
src = np.array([
[210, 50],
[610, 270],
[650, 480],
[150, 450]
], dtype=np.float32)
dst = np.array([ # 顺时针坐标
[150, 50],
[650, 50],
[650, 480],
[150, 480]
], dtype=np.float32)
M = cv2.getPerspectiveTransform(src, dst)
img_trans = cv.warpPerspective(img, M, dsize=(750, 500))
plt.imshow(img_trans)
4.6 图片仿射 (2D转化为3D)
import cv2
import numpy as np
img2 = cv2.imread('./2.png',1)
heigh,width,_= img2.shape
matSrc = np.float32([[0,0],[0,heigh-1],[width-1,0]]) # 左上角、左下角,右下角坐标
matDst = np.float32([[50,50],[100,heigh-200],[width-300,100]]) # 左上角、左下角,右下角坐标
matAffine = cv2.getAffineTransform(matSrc,matDst)
dst = cv2.warpAffine(img,matAffine,(heigh,width))
cv2.imshow('dst',dst)
cv2.waitKey(3)
4.6 图片灰度处理
Gray=(R+G+B)/3
Gray=(R0.299+G0.587+B*0.114))
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1 读入时设置位灰度
img0 = cv2.imread('./2.png',0) # 灰度
img1 = cv2.imread('./2.png',1) # 彩色BGR
# 2 转换颜色通道
dst = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
# 3 Gray=(R+G+B)/3
b,g,r = cv2.split(img1)
dst = (b+g+r)/3
plt.imshow(dst)
# 4 Gray=(R*0.299+G*0.587+B*0.114))
gray = ((b)*0.299+(g)*0.587+(r)*0.114)/3
dst1= np.uint8(gray)
plt.imshow(dst1)
4.7 图片颜色反转
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1 读入时设置位灰度
img0 = cv2.imread('./2.png',0) # 灰度
img1 = cv2.imread('./2.png',1) # 彩色BGR
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
b,g,r = cv2.split(img1)
dst = cv2.merge([255-b,255-g,255-r])
plt.imshow(dst)
4.8 图片马赛克
原理:马赛克区域为同一像素
'''
周围10*10用同一像素表示
'''
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./2.png',1) # 彩色BGR
heigh,width,_ = img.shape
for m in range(100,300):
for n in range(100,200):
if m%10 == 0 and n%10==0:
for i in range(0,10):
for j in range(0,10):
(b,g,r) = img[m,n]
img[i+m,j+n] = (b,g,r)
plt.imshow(img)
4.9 毛玻璃
原理:当前像素为周围随机像素
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./2.png',1) # 彩色BGR
heigh,width,_ = img.shape
dst = np.zeros((heigh,width,3),np.uint8)
mn = 8
for m in range(heigh):
for n in range(width):
index = int(random.random()*8)
(b,g,r) = img(m+index,n+index)
dst[m,n] = (b,g,r)
plt.imshow(dst)
4.10 颜色映射
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./2.png',1) # 彩色BGR
heigh,width,_ = img.shape
dst = np.zeros((heigh,width,3),np.uint8)
for i in range(heigh):
for j in range(width):
(b,g,r) = img[i,j]
b = b*1.5
g = g*1.3
if b > 255:
b = 255
if g > 255:
g = 255
dst = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(3)