• [其他] OpenCV(50)---实现油画效果-实现源码
    实现油画效果既然已经了解了实现油画效果的原理。下面,我们直接上代码来完成油画的操作。具体代码如下所示:# 油画效果 def oil_effect(img): h, w, n = img.shape new_img = np.zeros((h - 2, w, n), dtype=np.uint8) for i in range(h - 2): for j in range(w): if random.randint(1, 10) % 3 == 0: new_img[i, j] = img[i - 1, j] elif random.randint(1, 10) % 2 == 0: new_img[i, j] = img[i + 1, j] else: new_img[i, j] = img[i + 2, j] return new_img # 图像增强 def img_add(): img = Image.open("oil.jpg") enh_col = ImageEnhance.Color(img) color = 2.0 new_img = enh_col.enhance(color) new_img = cv2.cvtColor(np.asarray(new_img), cv2.COLOR_RGB2BGR) return new_img if __name__ == "__main__": img = cv2.imread("49.jpg") oil_img = oil_effect(img) cv2.imwrite("oil.jpg", oil_img) cv2.imshow("0", img) cv2.imshow("1", img_add()) cv2.waitKey() cv2.destroyAllWindows() 复制代码运行之后,效果如下:作者:极客学编程链接:https://juejin.cn/post/6992051940024647693来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(50)---实现油画效果
    油画的实现原理油画简单的理解是带有艺术感的图像,色彩相对于原图要更加鲜艳,但却是失真的。而且对于喜欢欣赏艺术的读者,肯定或多或少关注过油画,油画并不细腻,而且小部分因为色块的堆积非常模糊。所以,我们实现油画的原理是:逐行对图像进行处理,使周围相邻距离的像素进行打乱。至于打乱的算法,你可以随机设计。不过,需要注意的是在处理到图像边缘时,比如左下角最后一个像素,那么如果打乱其像素,取右边的显然不可取,因为右边没有像素会导致数组越界。所以在处理油画时,可以人为的剪掉部分边缘像素用于混淆。还有,油画因为用色大胆,所以我们需要增强图像的色彩空间。而python的PIL库有一个现成的类ImageEnhance。该类专门用于图像的增强处理,不仅可以增强图像的亮度,对比度,色度,还可以增强图像的锐度,因此我们实现油画可以通过它快速实现图像增强的操作。下面,我们来看看其图像增强如何实现。代码如下:enh_col=ImageEnhance.Color(img) color = 2.0 new_img = enh_col.enhance(color) 复制代码此处的img是PIL读取的图片,如果想PIL读取图片转到OpenCV读取图片的格式可以通过如下代码完成:new_img = cv2.cvtColor(np.asarray(new_img), cv2.COLOR_RGB2BGR) 复制代码其中,new_img为PIL读取的图片格式。而enhance函数的参数color代表了图像色彩的丰富程度和饱和度,数值为1时保持色度不变,数值增加表示色度比例增加,以此达到图像增强的效果。作者:极客学编程链接:https://juejin.cn/post/6992051940024647693来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(49)---实现素描效果(3)
    高斯滤波通过上面的代码,我们实现了第一步转换为灰度图像,也实现了第二步进行反色操作。接下来,我们需要做的就是实现高通滤波。高通滤波在17篇博文图像平滑处理中已经介绍。实现高通滤波的函数为:cv2.GaussianBlur()。下面,我们来对图像进行第三个操作:对反色图像进行高通滤波。代码如下:def sketch_effect(img): h, w, n = img.shape gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) zero_img = np.zeros((h, w), dtype=np.uint8) anti_color = cv2.addWeighted(gray, -1, zero_img, 0, 255, 0) cv2.imshow("2", anti_color) grayGB = cv2.GaussianBlur(anti_color, (15, 15), 0) new_img = cv2.addWeighted(gray, 0.5, grayGB, 0.5, 0) return new_img if __name__ == "__main__": img = cv2.imread("4.jpg") cv2.imshow("0", img) cv2.imshow("1", sketch_effect(img)) cv2.waitKey() cv2.destroyAllWindows() 复制代码运行之后效果如下:左0为原图,中间1为实现的素描效果,右2为反色图像。作者:极客学编程链接:https://juejin.cn/post/6991680453769969700来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(49)---实现素描效果(2)
    反色的实现既然步骤中有反色的操作,那么在OpenCV中如何实现反色操作呢?其实,实现反色可以通过cv2.addWeighted()函数来实现。原理是:用一张图片像素为0的图像与灰度图像进行叠加,而这个全0的像素图像宽高必须与原图的宽高一致,同时其gamma参数必须设置为255。具体代码如下:def sketch_effect(img): new_img = img.copy() h, w, n = img.shape gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) zero_img = np.zeros((h, w), dtype=np.uint8) gray = cv2.addWeighted(gray, -1, zero_img, 0, 255, 0) 复制代码反色运算换算成数学公式如下:dst=src1alpha+src2beta+gamma作者:极客学编程链接:https://juejin.cn/post/6991680453769969700来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(49)---实现素描效果
    素描的实现原理要实现一种图像处理的效果,首先我们需要掌握其实现的具体原理。相信经常使用PS的用户肯定自己通过该软件处理过素描的效果实现。那么,我们可以参考一样PS实现素描效果的步骤:去色:因为素描只有黑白两种颜色,所以彩色图像必须转换为灰度图像复制去色图层,并且反色。反色的公式为:Y(i,j)=255-X(i,j)对反射图像进行高斯模糊模糊后的图像叠加模式选择颜色减淡效果而颜色减淡的公式如下:C=MIN(A+(A+B)/(255-B),255)C:混合结果A:去色后的像素点B:高斯模糊后的像素点作者:极客学编程链接:https://juejin.cn/post/6991680453769969700来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(48)---实现怀旧滤镜与连环画滤镜(2)
    有了公式,下面直接套用公式即可。具体代码如下所示:# 连环画滤镜 def comics_effect(img): new_img = img.copy() h, w, n = img.shape for i in range(w): for j in range(h): b = img[j, i, 0] g = img[j, i, 1] r = img[j, i, 2] R = int(int(abs(g - b + g + r)) * r / 256) G = int(int(abs(b - g + b + r)) * r / 256) B = int(int(abs(b - g + b + r)) * g / 256) new_img[j, i, 0] = R new_img[j, i, 1] = G new_img[j, i, 2] = B return new_img if __name__ == "__main__": img = cv2.imread("48.jpg") cv2.imshow("0", img) cv2.imshow("1", comics_effect(img)) cv2.waitKey() cv2.destroyAllWindows() 复制代码运行之后,效果如下:综上所述,基本上所有的基础滤镜都是通过对RGB通道的颜色值进行公式计算得到的。当然,要是数学很好,又对算法情有独钟的读者,可以自己自研滤镜算法丰富滤镜的效果。作者:极客学编程链接:https://juejin.cn/post/6991444362093658148来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(48)---实现怀旧滤镜与连环画滤镜
    怀旧滤镜实现原理不管是荣耀华为手机还是其他的手机,我们都可以找到相机中的怀旧效果,这是手机中常用的一种滤镜效果。怀旧风格的设计主要是在图像的颜色空间进行处理。以BGR为例,对B、G、R这3个通道的颜色数值进行处理,让图像有一种泛黄的怀旧效果。设计的转换公式如下:B=0.272r+0.534g+0.131*bG=0.349r+0.686g+0.168*bR=0.393r+0.769g+0.189*b计算公式中的小写的bgr是原图像的RGB通道的颜色,结果BGR是怀旧变换后的值。需要注意的是,颜色值的范围在[0,255],需要在程序中约束一下。实现怀旧滤镜既然我们已经了解了其实现的原理公式。下面我们直接上代码实现该功能,具体代码如下所示:def cowboy_effect(img): new_img = img.copy() h, w, n = img.shape for i in range(w): for j in range(h): b = img[j, i, 0] g = img[j, i, 1] r = img[j, i, 2] B = int(0.272 * r + 0.534 * g + 0.131 * b) G = int(0.349 * r + 0.686 * g + 0.168 * b) R = int(0.393 * r + 0.769 * g + 0.189 * b) new_img[j, i, 0] = max(0, min(B, 255)) new_img[j, i, 1] = max(0, min(G, 255)) new_img[j, i, 2] = max(0, min(R, 255)) return new_img if __name__ == "__main__": img = cv2.imread("48.jpg") cv2.imshow("0", img) cv2.imshow("1", cowboy_effect(img)) cv2.waitKey() cv2.destroyAllWindows() 运行之后,效果如下:作者:极客学编程链接:https://juejin.cn/post/6991444362093658148来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(47)---实现抖音哈哈镜效果
    前言在抖音中,我们经常看到各种抖音玩家都喜欢使用哈哈镜效果。那么什么是哈哈镜呢?在现实生活中,哈哈镜是指一种表面凹凸不平的镜子,可以反应出人像及物体的扭曲面貌。简单点来说就是拉伸人脸(物件),或者压缩人脸(物体)的效果。哈哈镜的实现原理如下:假设输入图像的宽高为w和h,图像中心点的坐标为(cx,cy)。那么图像中任意一点(x,y)到中心点的距离为(x-cx),(y-cy)。那么拉升放大,图像变换的半径为r(r是哈哈镜的范围大小),得到公式如下:x=(tx/2)(sqrt(txtx+tyty)/r)+cx y=(ty/2)(sqrt(txtx+tyty)/r)+cy同理,压缩缩小的公式如下(compress为压缩强度):x=cos(atan2(ty,tx))compresssqrt(sqrt(txtx+tyty))+cxy=cos(atan2(ty,tx))compresssqrt(sqrt(txtx+tyty))+cy哈哈镜放大效果既然我们了解了其数学公式以及其实现的原理,下面我们来直接实现哈哈镜的放大效果。具体代码如下所示:#哈哈镜放大效果实现 def enlarge_effect(img): h, w, n = img.shape cx = w / 2 cy = h / 2 radius = 100#该值可以自行定义,它决定了哈哈镜的大小,当图像很大时,应该相应的调大 r = int(radius / 2.0) new_img = img.copy() for i in range(w): for j in range(h): tx = i - cx ty = j - cy distance = tx * tx + ty * ty if distance < radius * radius: x = int(int(tx / 2.0) * (math.sqrt(distance) / r) + cx) y = int(int(ty / 2.0) * (math.sqrt(distance) / r) + cy) if x < w and y < h: new_img[j, i, 0] = img[y, x, 0] new_img[j, i, 1] = img[y, x, 1] new_img[j, i, 2] = img[y, x, 2] return new_img if __name__ == "__main__": img = cv2.imread("4.jpg") enlarge_img = enlarge_effect(img) cv2.imshow("4", enlarge_img) cv2.waitKey() cv2.destroyAllWindows() 复制代码运行之后,效果如下:需要注意的是,上面的计算过程可能导致有浮点数的出现,而像素值必须为整数。所以,为了保证像素值的有效性,必须在计算过程完整之后,进行强制类型转换int()。另外,计算x,y值时,可能会导致超过图像坐标的范围,所以必须用x<w和y<h来判断防止越界。作者:极客学编程链接:https://juejin.cn/post/6991077592946196510来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(45)---直方图均衡化处理:去雾
    直方图均衡化直方图均衡化的目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均衡的图像。这种均衡化,即实现了灰度值统计上的概率均衡,也实现了人类视觉系统上(HSV)的视觉均衡。一般来说,直方图均衡化可以达到增强图像显示效果的目的。最常用的比如去雾。下面,我们来分别实现灰度图像去雾以及彩色图像去雾。实现灰度图像去雾在OpenCV中,它提供了函数cv2.equalizeHist()来实现直方图均衡化,该函数的完整定义如下:def equalizeHist(src, dst=None): src:原始图像,必须是8位单通道原始图像dst:返回值,返回直方图均值化处理结果下面,我们来通过该函数实现灰度图像直方图均衡化处理,代码如下:import cv2 import matplotlib.pyplot as plt img = cv2.imread("45.jpg", 0) equ = cv2.equalizeHist(img) cv2.imshow("1",img) cv2.imshow("2",equ) plt.figure("原始图像直方图") plt.hist(img.ravel(), 256) plt.figure("均衡化图像直方图") plt.hist(equ.ravel(), 256) plt.show() cv2.waitKey() cv2.destroyAllWindows() 运行之后,效果如下:左边为原图,右边是处理后的图像,可以看到图像前景的雾,基本已经去掉了。不过,我们还是看看处理前后的直方图结果分布实现彩色图像去雾虽然上面的灰度图像达到了去雾的基本效果,但是说实话,大多数实际的场景中,我们用到最多的往往是彩色图像。所以,掌握彩色图像的直方图均衡化处理,才是我们真正的实战技能。下面我们来用代码实现彩色图像直方图均衡化处理,代码如下:import cv2 import matplotlib.pyplot as plt img = cv2.imread("50.jpg") blue = img[:, :, 0] green = img[:, :, 1] red = img[:, :, 2] blue_equ = cv2.equalizeHist(blue) green_equ = cv2.equalizeHist(green) red_equ = cv2.equalizeHist(red) equ = cv2.merge([blue_equ, green_equ, red_equ]) cv2.imshow("1",img) cv2.imshow("2",equ) plt.figure("原始图像直方图") plt.hist(img.ravel(), 256) plt.figure("均衡化图像直方图") plt.hist(equ.ravel(), 256) plt.show() cv2.waitKey() cv2.destroyAllWindows() 复制代码这里,我们只需要使用equalizeHist()函数对彩色图像的每个颜色进行均衡化处理即可。当然,需要注意的是,我们处理完每个颜色之后,需要将图像再次合并。运行之后效果如下:\作者:极客学编程链接:https://juejin.cn/post/6990676257151123469来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(40)---K近邻算法识别数字(3)
    K近邻算法模型搭建不管是K近邻算法还是机器学习算法,我们一般搭建机器学习模型都分为2个步骤。第1步,划分训练集与测试集,第2步完成模型的搭建.下面我们具体实现,代码如下:import cv2 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier as KNN df = pd.read_excel("手写字体识别.xlsx") # 提取特征变量,识别数字时,其特征就是1024个0,1数据,而目标变量就是1024个数字组成对应的结果数字 X = df.drop(columns="对应数字") Y = df['对应数字'] x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=111) knn = KNN(n_neighbors=5) knn.fit(x_train, y_train) answer=knn.predict(img_array) print("图中的数字是:"+str(answer[0])) 这里,我们首先读取手写字体识别的数据集,然后提取特征变量与目标变量。再然后,使用train_test_split函数将获取的数据集分为测试集与训练集,test_size=0.2表示将20%的数据划为测试集,训练集返回x_train,y_train,测试集返回x_test,y_test。接着,使用训练集数据建模fit,这里K近邻算法n_neighbors=5,表示选取5个近邻点来决定数字图片的分类,或者说识别判断。建模完成之后,可以将上面转换图片的一维数组,直接代入到knn.predict函数中,得到预测的结果。我们测试的图片如下:运行之后,得到的结果如下:作者:极客学编程链接:https://juejin.cn/post/6990199241796747278来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(40)---K近邻算法识别数字(2)
    识别数字在OpenCV-Python开发指南的第一篇我们就介绍了二值图像,二值图像可以区分形状已经物体大概的轮廓。如下图所示:这里的图像A就是0和1的矩阵集合,数字1代表有颜色的地方,数字0代表无颜色的地方。这里,我们提供给机器学习的样本数据为1024个元素的一维数组,通过Excel表格提供,而图像是一个矩阵并不是一维数组。所以,在处理原始图像时,我们需要将图片的矩阵数据转换为一维数组,以便于机器学习的匹配预测。调整图像首先,我们需要识别的数字图像可能并不是一个二值图像,甚至可能不是一个灰度图像。所以我们需要将其转换为二值图像。其次,OpenCV转换的二值图像是一个矩阵,而机器学习训练的数据是一个1024长度的一维数组。所以,我们还需要将图像缩小为32*32像素的图像,这样其转换为一维数组才是1024个0,1数据。具体代码如下:import cv2 img = cv2.imread("40.jpg") img = cv2.resize(img, (32, 32)) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) t, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) img[img == 255] = 1 img_array= img.reshape(1, -1) # 转换为一维数组 这里,我们首先获取图像,然后将图像转换为32*32像素的大小。接着,在转换为灰度图像,并通过二值化处理将图像变更为0和255两个值,最后将255白色的部分替换成1。最后,将其转换为一维数组。作者:极客学编程链接:https://juejin.cn/post/6990199241796747278来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(40)---K近邻算法识别数字(1)
    K近邻算法机器学习算法是从数据中产生模型,也就是进行学习的算法。我们把经验提供给算法,它就能够根据经验数据产生模型。在面对新的情况时,模型就会为我们提供预测的结果。例如,识别数字,文字时,其实识别它们并不需要颜色,使用二值图像就行,而二值图像的数字文字都是0,1组成,机器学习会根据0与1的位置匹配最相近的文字或者数字,从而得出结果。而机器学习中的K近邻算法最适合识别图像中的文字或者数字信息。K近邻算法又称为KNN算法,是非常经典的机器学习算法。其原理非常简单:对于一个新样本,这里可以理解为一个新数字图像或文字图像,K近邻算法会在已有数据中寻找与它最相似的K个数据,或者说离它最近的K个数据,如果这K个数据大多数属于某个类别,则该样本也属于这个类别。作者:极客学编程链接:https://juejin.cn/post/6990199241796747278来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(39)---视频处理VideoWriter类(2)
    实战保存摄像头录制的视频通过上面的讲解,我们已经知道了如何保存摄像头的视频。下面,我们来实战保存摄像头录制的视频影像,具体代码如下所示:import cv2 cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter.fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480)) while (cap.isOpened()): ret, frame = cap.read() if ret: out.write(frame) cv2.imshow('video', frame) c = cv2.waitKey(1) if c == 27: break else: break cap.release() out.release() cv2.destroyAllWindows() 运行之后,我们就会捕获摄像头录制的视频,直到你按下ESC键后停止。录制Canny边缘检测视频通过上文,我们知道如果如果后期处理视频,就需要对其每一帧的图像进行处理。现在,我们来实现Canny边缘检测,具体代码如下:import cv2 cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter.fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480)) while (cap.isOpened()): ret, frame = cap.read() if ret: frame=cv2.Canny(frame,100,200) out.write(frame) cv2.imshow('video', frame) c = cv2.waitKey(1) if c == 27: break else: break cap.release() out.release() cv2.destroyAllWindows() 运行之后,我们的视频效果如下:作者:极客学编程链接:https://juejin.cn/post/6989915535341273095来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] OpenCV(39)---视频处理VideoWriter类(1)
    VideoWriter在OpenCV中,它给我们提供了cv2.VideoWriter类将图片序列保存为视频。同时,通过该类,我们也可以修改视频的各种属性,完成对视频类型的转换。一般我们使用cv2.VideoWriter类,需要如下3个步骤。构造函数OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。该函数的完整定义如下:cv2.VideoWriter(filename,fourcc,fps,frameSize[,isColor]) filename:需要输出保存的视频文件名。如果文件名存在,覆盖原文件。fourcc:视频的编码类型。在OpenCV中,cv2.VideoWriter_fourcc()函数用来指定视频的编码格式。该函数的参数有4个,这4个字符构成了编/解码器的“4字标记”,每个编/解码器都有一个这样的标记。常用标记如下表:取值含义cv2.VideoWriter_fourcc('I','4','2','0')未压缩的YUV颜色编码格式,色度子采样为4:2:0,该编码格式具有较好的兼容性,但生成的视频文件较大,文件扩展名为.avicv2.VideoWriter_fourcc('P','I','M','I')MPEG-1编码格式,生成的文件扩展名为.avicv2.VideoWriter_fourcc('X','V','I','D')MPEG-4编码格式,如果希望得到的视频大小为平均值,可以选用这个参数组合。文件扩展名为.avicv2.VideoWriter_fourcc('T','H','E','O')Ogg Vorbis编码格式,文件扩展名为.ogvcv2.VideoWriter_fourcc('F','L','V','I')Flash视频格式,文件扩展名为.flvcv2.VideoWriter_fourcc('M','P','4','V')文件扩展名.mp4fps:帧速率,比如录制视频每秒30帧,或者60帧等。frameSize:帧的长宽isColor:是否为彩色图像write函数cv2.VideoWriter类中还提供了cv2.VideoWriter.write()函数用于写入下一帧视频。其完整定义如下:cv2.VideoWriter.write(image) image参数是需要写入的视频帧,也就是前篇博文最后实战项目中的frame。释放同样的,在不需要cv2.VideoWriter类对象时,需要将其释放。释放所使用的函数为cv2.VideoWriter.release()。作者:极客学编程链接:https://juejin.cn/post/6989915535341273095来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • [其他] 如何处理使用opencv.imshow造成的内核崩溃
    问题现象当在Notebook中使用opencv.imshow后,会造成Notebook崩溃。原因分析opencv的cv2.imshow在jupyter这样的client/server环境下存在问题。 而matplotlib不存在这个问题。解决方法参考如下示例进行图片显示。注意opencv加载的是BGR格式, 而matplotlib显示的是RGB格式。Python语言:from matplotlib import pyplot as plt import cv2 img = cv2.imread('图片路径') plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.title('my picture') plt.show()
总条数:305 到第
上滑加载中