img = cv2.imread('yahboom.jpg', 0) 第一个参数是图片的路径,第二个参数是如何读取这幅图片。
cv2.IMREAD_UNCHANGED:保持原格式不变,-1;
cv2.IMREAD_GRAYSCALE:以灰度模式读入图片,可以用0表示;
cv2.IMREAD_COLOR:,读入一副彩色图片,可以用1表示;
cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道,可以用2表示。
cv.imshow('frame', frame):打开一个窗口名为frame,并且显示frame帧数据(图像/视频数据)
参数含义:
第一个参数表示创建打开的窗口的名字;
第二个参数表示需要显示的图片。
运行程序,
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 1_1.py
xxxxxxxxxx
import cv2 as cv
if __name__ == '__main__':
img = cv.imread('yahboom.jpg')
while True :
cv.imshow("frame",img)
action = cv.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv.destroyAllWindows()
参数含义:
第一个参数是保存的文件名,第二个参数是保存的图像。
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 1_2.py
xxxxxxxxxx
import cv2 as cv
if __name__ == '__main__':
img = cv.imread('yahboom.jpg')
cv.imwrite("yahboom_new.jpg",img) #新建文件yahboom_new.jpg,并且把yahboom.jpg
写进去
new_img = cv.imread('yahboom_new.jpg') #读取新写入的图片
while True :
cv.imshow("frame",img)
cv.imshow("new_frame",new_img)
action = cv.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv.destroyAllWindows()
capture=cv.VideoCapture(0)
参数含义:
VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如cap =
cv2.VideoCapture(“../test.avi”)
ret,img = frame.read()
返回值含义:
ret:ret是一个bool值,判断是否读回正确的帧
img:每一帧的图像数据
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 1_3.py
xxxxxxxxxx
import cv2 as cv
if __name__ == '__main__':
frame = cv.VideoCapture(0)
while frame.isOpened():
ret,img = frame.read()
cv.imshow('frame',img)
action = cv.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
frame.release()
cv.destroyAllWindows()
首先,我们先要读取图像,然后修改bgr的数值,赋值一个区域为黑色。
运行程序
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 1_4.py
xxxxxxxxxx
import cv2
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
(b,g,r) = img[100,100]
print(b,g,r)
i=j=0
for j in range(1,255):
img[i,j] = (0,0,0)
for j in range(1,255):
img[i,j] = (0,0,0)
while True :
cv2.imshow("frame",img)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
红色框部分就是修改的色素值。
参数含义:
InputArray src:输入图片
OutputArray ds:输出图片
Size:输出图片尺寸
fx,fy:沿x轴,y轴的缩放系数
interpolation:插入方式,可选择INTER_NEAREST(最近邻插值),INTER_LINEAR(双线性插值(默
认设置)),INTER_AREA(使用像素区域关系进行重采样),INTER_CUBIC(4x4像素邻域的双三次插
值),INTER_LANCZOS4(8x8像素邻域的Lanczos插值)
需要注意:
输出尺寸格式为(宽,高)
默认的插值方法为:双线性插值
运行程序
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 2_1.py
xxxxxxxxxx
import cv2
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
print(img.shape)
x, y = img.shape[0:2]
img_test1 = cv2.resize(img, (int(y / 2), int(x / 2)))
while True :
cv2.imshow("frame",img)
cv2.imshow('resize0', img_test1)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
首先读取图像,然后再数组中获取像素点区域。下面代码中选取形区域X:300-500 Y:500-700,注意图像尺寸是800*800,所以选择的区域不要超过此分辨率。
运行程序
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 2_2.py
xxxxxxxxxx
import cv2
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
dst = img[0:100,100:200]
while True :
cv2.imshow("frame",img)
cv2.imshow('dst', dst)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
参数含义:
src:输入图像
M:变换矩阵
dsize:输出图像的大小
flags:插值方法的组合(int 类型!)
borderMode:边界像素模式(int 类型!)
borderValue:(重点!)边界填充值; 默认情况下,它为0
上述参数中:M作为仿射变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3的变换矩阵。
在日常进行仿射变换是,只设置前三个参数的情况下,如cv2.warpAffine(img,M,(rows,cols))就可以实现
基本的仿射变换效果。
通过转换矩阵M实现将原始图像src转换为目标图像dst:
dst(x, y) = src(M11x + M12y+M13, M21x+M22y+M23)
将原始图像src向右侧移动200、向下移动100个像素,则其对应关系为:
dst(x, y) = src(x+200, y+100)
将上述表达式补充完整,即:
dst(x, y) = src(1·x + 0·y + 200, 0·x + 1·y + 100)
根据上述表达式,可以确定对应的转换矩阵M中各个元素的值为:
M11=1
M12=0
M13=200
M21=0
M22=1
M23=100
将上述值代入转换矩阵M,得到:
M = [ ]
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 2_3.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
matShift = np.float32([[1,0,10],[0,1,10]])# 2*3
dst = cv2.warpAffine(img, matShift, (width,height))
while True :
cv2.imshow("frame",img)
cv2.imshow('dst', dst)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
图像的镜像变换分为两种:水平镜像和垂直镜像。水平镜像以图像垂直中线为轴,将图像的像素进行对换,也就是将图像的左半部和右半部对调。垂直镜像则是以图像的水平中线为轴,将图像的上半部分和下半部分对调。
变换原理:
设图像的宽度为width,长度为height。(x,y)为变换后的坐标,(x0,y0)为原图像的坐标,
水平镜像变换
向前映射:x=width-x0-1,y=y0
向后映射:x0=width-x-1,y0=y
垂直镜像变换
向上映射:x=x0,y=height-y0-1
向下映射:x0=x,y0=height-y-1
总结:在水平镜像变换时,遍历了整个图像,然后根据映射关系对每个像素都做了处理。实际上,水平镜像变换就是将图像坐标的列换到右边,右边的列换到左边,是可以以列为单位做变换的。同样垂直镜像变换也如此,可以以行为单位进行变换。
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 2_4.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
newImgInfo = (height*2,width,deep)
dst = np.zeros(newImgInfo,np.uint8)#uint8
for i in range(0,height):
for j in range(0,width):
dst[i,j] = img[i,j]
dst[height*2-i-1,j] = img[i,j]
while True :
cv2.imshow("frame",img)
cv2.imshow('dst', dst)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
彩色图像转化为灰度图像的过程是图像的灰度化处理。彩色图像中的每个像素的颜色由R,G,B三个分量决定,而每个分量中可取值0-255,这样一个像素点可以有1600多万(256256256=1677256)的颜色的变化范围。而灰度图像是R,G,B三个分量相同的一种特殊的彩色图像,其中一个像素点的变化范围为256种,所以在数字图像处理中一般将各种格式的图像转化为灰度图像以使后续的图像的计算量少一些。灰度图像的描述与彩色图像一样仍然反映了整副图像的整体和局部的色度和高亮等级的分布和特征。
灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程。灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素最下为0,为黑色)。图像灰度化核心思想是 R = G = B ,这个值也叫灰度值。
1)最大值法:使转化后的R,G,B得值等于转化前3个值中最大的一个,即:R=G=B=max(R,G,B)。这种方法转换的灰度图亮度很高。
2)平均值法:是转化后R,G,B的值为转化前R,G,B的平均值。即:R=G=B=(R+G+B)/3。这种方法产生的灰度图像比较柔和。
在OpenCV中,用cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)来实现对图像进行灰度化处理
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_1.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
while True :
cv2.imshow("frame",img)
cv2.imshow('gray', gray)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
设阈值,大于阈值的为0(黑色)或 255(白色),使图像称为黑白图。阈值可固定,也可以自适应阈值。自适应阈值一般为一点像素与这点为中序的区域像素平均值或者高斯分布加权和的比较,其中可以设置一个差值也可以不设置。
参数含义:
src:原图像
threshold:当前阈值
maxVal:最大阈值,一般为255
thresholdType:阈值类型,一般有下面几个值,
THRESH_BINARY = 0,#大于阈值的像素点的灰度值设定为maxValue(如8位灰度值最大为255),灰度值小于阈值的像素点的灰度值设定为0。
THRESH_BINARY_INV = 1,#大于阈值的像素点的灰度值设定为0,而小于该阈值的设定为maxValue。
THRESH_TRUNC = 2,#大于阈值的像素点的灰度值设定为0,而小于该阈值的设定为maxValue。
THRESH_TOZERO = 3,#像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。
THRESH_TOZERO_INV = 4 #像素点的灰度值大于该阈值的不进行任何改变,像素点的灰度值小于该阈值的,其灰度值全部变为0。
返回值:
retval:与参数thresh一致3
dst: 结果图像
注意:在进行二值化之前,我们需要把彩色图进行灰度化处理,得到灰度图。
运行程序
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_2.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh1=cv2.threshold(gray,180,255,cv2.THRESH_BINARY_INV)
while True :
cv2.imshow("frame",img)
cv2.imshow('gray', gray)
cv2.imshow("binary",thresh1)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
在保留原有图像属性的情况下,显著减少图像的数据规模。目前有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法,而且仍在研究中广泛使用。
在目前常用的边缘检测方法中,Canny边缘检测算法是具有严格定义的,可以提供良好可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势,成为边缘检测最流行的算法之一。
Canny边缘检测算法可以分为以下5个步骤:
使用高斯滤波器,以平滑图像,滤除噪声
计算图像中每个像素点的梯度强度和方向
应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应
应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘
通过抑制孤立的弱边缘最终完成边缘检测
图像灰度化:gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
高斯过滤(减噪处理)图像:GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])-> dst
src:输入的图像,一般是灰度后的图片
ksize:高斯内核大小
sigmaX :X方向上的高斯核标准偏差
sigmaY :Y方向上的高斯核标准差
dst:处理后的图像
Canny方法处理得到图像:edges=cv2.Canny( image, threshold1, threshold2[, apertureSize[,L2gradient]])
edges:计算得到的边缘图像
image :计算得到的边缘图像,一般是高斯处理后得到的图像
threshold1 :处理过程中的第一个阈值
threshold2 :处理过程中的第二个阈值
apertureSize :Sobel 算子的孔径大小
L2gradient :计算图像梯度幅度(gradient magnitude)的标识默认值为 False。如果为 True,则使用更精确的 L2 范数进行计算(即两个方向的导数的平方和再开方),否则使用 L1 范数(直接将两个方向导数的绝对值相加)。
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_3.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgG = cv2.GaussianBlur(gray,(3,3),0)
dst = cv2.Canny(imgG,50,50)
while True :
cv2.imshow("frame",img)
cv2.imshow('gray', gray)
cv2.imshow("canny",dst)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
参数含义:
dst:输出图像
pt1,pt2:必选参数。线段的坐标点,分别表示起始点和终止点
color:必选参数。用于设置线段的颜色
thickness:可选参数。用于设置线段的宽度
lineType:可选参数。用于设置线段的类型,可选8(8邻接连接线-默认)、4(4邻接连接线)和cv2.LINE_AA 为抗锯齿
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_4.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
line = cv2.line(img, (50,20), (20,100), (255,0,255), 10)
while True :
cv2.imshow("line",line)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
参数含义:
img:画布或者载体图像
pt1,pt2:必选参数。矩形的顶点,分别表示顶点与对角顶点,即矩形的左上角与右下角(这两个顶点可以确定一个唯一的矩形),可以理解成是对角线。
color:必选参数。用于设置矩形的颜色
thickness:可选参数。用于设置矩形边的宽度,当值为负数时,表示对矩形进行填充
lineType:可选参数。用于设置线段的类型,可选8(8邻接连接线-默认)、4(4邻接连接线)cv2.LINE_AA 为抗锯齿
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_5.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
rect = cv2.rectangle(img, (50,20), (100,100), (255,0,255), 10)
while True :
cv2.imshow("line",rect)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
参数含义:
img:画或者载体图像布
center:为圆心坐标,格式: (50,50)
radius:半径
thickness: 线条粗细。默认为1.如果-1则为填充实心
lineType:线条类型。默认是8,连接类型。如下表说明
3.6.2、代码和实际效果展示
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_6.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
circle = cv2.circle(img, (80,80), 50, (255,0,255), 10)
while True :
cv2.imshow("circle",circle)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
参数含义:
center:椭圆的中心点,(x,y)
axes:指的是短半径和长半径,(x,y)
StartAngle:圆弧起始角的角度
endAngle:圆弧终结角的角度
img、color、thickness、lineType可以参考圆的说明
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_7.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
ellipse = cv2.ellipse(img, (80,80), (20,50),0,0, 360,(255,0,255), 5)
while True :
cv2.imshow("ellipse",ellipse)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
参数含义:
pts:多边形的顶点
isClosed:是否闭合。(True/False)
其他参数参照圆的绘制参数
运行程序
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_8.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
points = np.array([[120,50], [40,140], [120,70], [110,110], [50,50]],np.int32)
polylines = cv2.polylines(img, [points],True,(255,0,255), 5)
while True :
cv2.imshow("polylines",polylines)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
参数含义:
img:输入图像
str:绘制的文字
origin:左上角坐标(整数),可以理解成文字是从哪里开始的
font:字体
size:字体大小
color:字体颜色
thickness:字体粗细
其中,字体可选,
运行程序
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_9.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
cv2.putText(img,'This is Yahboom!',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,200,0),2)
while True :
cv2.imshow("img",img)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
图像修复是计算机视觉中的一类算法,其目标是填充图像或视频内的区域。该区域使用二进制掩模进行标识,填充通常根据需要填充的区域边界信息来完成。图像修复的最常见应用是恢复旧的扫描照片。它还用于删除图像中的小的不需要的对象。
参数含义:
src:源图像,也就是需要修复的图像
inpaintMask:二进制掩码,指示要修复的像素。
dst:结果图像
inpaintRadius:表示修复的半径
flags : 修复算法,主要有INPAINT_NS (Navier-Stokes based method) or INPAINT_TELEA (Fastmarching based method)
基于Navier-Stokes的修复应该更慢,并且倾向于产生比fast marching method的方法更模糊的结果。在实践中,我们没有发现这种情况。INPAINT_NS在我们的测试中产生了更好的结果,速度也略高于INPAINT_TELEA。
(1)、首先,我们先根据完好的图片,对其增加破损,可以理解成是修改其特定部分的像素值,
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 4_1_1.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
for i in range(50,100):
img[i,50] = (0,0,0)
img[i,50+1] = (0,0,0)
img[i,50-1] = (0,0,0)
for i in range(100,150):
img[150,i] = (0,0,0)
img[150,i+1] = (0,0,0)
img[150-1,i] = (0,0,0)
cv2.imwrite("damaged.jpg",img)
dam_img = cv2.imread('damaged.jpg')
while True :
cv2.imshow("dam_img",dam_img)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
运行后会生成一张图片,这张图片看成是原图的破损图片,
(2)、修复刚才创建的照片,首先先读取,然后创建掩码,最后使用函数修复它
运行程序
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 4_1_2.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
dam_img = cv2.imread('damaged.jpg')
imgInfo = dam_img.shape
height = imgInfo[0]
width = imgInfo[1]
paint = np.zeros((height,width,1),np.uint8)
for i in range(50,100):
paint[i,50] = 255
paint[i,50+1] = 255
paint[i,50-1] = 255
for i in range(100,150):
paint[150,i] = 255
paint[150+1,i] = 255
paint[150-1,i] = 255
dst_img = cv2.inpaint(dam_img,paint,3,cv2.INPAINT_TELEA)
while True :
cv2.imshow("dam_img",dam_img)
cv2.imshow("paint",paint)
cv2.imshow("dst",dst_img)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
如图所示,左边为修复前,中间的是掩码图片,右边是修复后的原图。
实现过程:对每个像素点的三通道值进行同步放大,同时保持通道值在0-255之间,实际上就是遍历每个像素点,给他们加减数值,然后再判断三个通道rgb是否在0-255区间,大于或者小于则取值255或者0。
运行程序,
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 4_2.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
for i in range(0,height):
for j in range(0,width):
(b,g,r) = img[i,j]
bb = int(b) + 100
gg = int(g) + 100
rr = int(r) + 100
if bb > 255:
bb = 255
if gg > 255:
gg = 255
if rr > 255:
rr = 255
dst[i,j] = (bb,gg,rr)
while True :
cv2.imshow("dst",dst)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()
左边图片是原图,后边图片是增加亮度后的照片。
OpenCV实现对图片磨皮美白的功能,实现的原理和“1.20 OpenCV图片亮度增强”的原理基本上是一样的,只不过这里我们不需要对r值做处理,只需要按照这个公式,p = p(x)*1.4+ y,其中p(x)表示b通道或者g通道,y表示需要增减的数值,同样的,加了数值后,我们需要对数值做判断。
运行程序
xxxxxxxxxx
cd /root/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 4_3.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('yahboom.jpg')
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
for i in range(0,height):
for j in range(0,width):
(b,g,r) = img[i,j]
bb = int(b*1.4) + 5
gg = int(g*1.4) + 5
if bb > 255:
bb = 255
if gg > 255:
gg = 255
dst[i,j] = (bb,gg,r)
while True :
cv2.imshow("origin",img)
cv2.imshow("dst",dst)
action = cv2.waitKey(10) & 0xFF
if action == ord('q') or action == 113:
break
img.release()
cv2.destroyAllWindows()