当前位置: 首页 > news >正文

外贸商城网站制作公司毕业设计做系统网站

外贸商城网站制作公司,毕业设计做系统网站,中国建筑网官网新闻,seo优化网站建设公司1#xff0c;图像算术运算 图像的算术运算有很多种#xff0c;比如两幅图像可以相加#xff0c;相减#xff0c;相乘#xff0c;相除#xff0c;位运算#xff0c;平方根#xff0c;对数#xff0c;绝对值等#xff1b;图像也可以放大#xff0c;缩小#xff0c;旋…1图像算术运算 图像的算术运算有很多种比如两幅图像可以相加相减相乘相除位运算平方根对数绝对值等图像也可以放大缩小旋转还可以截取其中的一部分作为ROI感兴趣区域进行操作各个颜色通道还可以分别提取对各个颜色通道进行各种运算操作。总之对图像可以进行的算术运算非常的多。这里先学习图片间的数学运算图像混合按位运算。 1.1 图片加法 要叠加两张图片可以用 cv2.add() 函数相加两幅图片的形状高度/宽度/通道数必须相同 numpy中可以用 res img1 img2 相加但这两者的结果并不相同。 x np.uint8([250]) y np.uint8([10]) print(cv2.add(x, y)) # 25010 260 255 print(x y) # 25010 260 % 256 4 如果是二值化图片只有0和255两者结果是一样的用 numpy的方式更简便一些。 这里我们代入图像中看一下 #encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt# 举一个极端的例子真的只是运气好遇到了。。。。 img cv2.imread(lena.jpg) img_add img 10 img_add2 cv2.add(img, img_add)print(img[0:4, :, 0]) print(img_add[0:4, :, 0]) print(img_add2[0:4, :, 0])这个是 logo1.jpg 的效果[[246 246 246 ... 246 246 246][246 246 246 ... 246 246 246][246 246 246 ... 246 246 246][246 246 246 ... 246 246 246]] [[0 0 0 ... 0 0 0][0 0 0 ... 0 0 0][0 0 0 ... 0 0 0][0 0 0 ... 0 0 0]] [[246 246 246 ... 246 246 246][246 246 246 ... 246 246 246][246 246 246 ... 246 246 246][246 246 246 ... 246 246 246]]这个是 lena.jpg 的效果 [[126 125 124 ... 128 120 90][127 126 124 ... 135 131 96][124 123 121 ... 144 138 96][116 119 116 ... 73 56 35]][[136 135 134 ... 138 130 100][137 136 134 ... 145 141 106][134 133 131 ... 154 148 106][126 129 126 ... 83 66 45]][[255 255 255 ... 255 250 190][255 255 255 ... 255 255 202][255 255 252 ... 255 255 202][242 248 242 ... 156 122 80]]# 我们发现 使用numpy库的加法则运算结果取模使用opencv的add()函数则运算结果当大于255则取255注意OpenCV中的加法与Numpy的加法是有所不同的OpenCV的加法是一种饱和操作而Numpy的加法是一种模操作。 Numpy库的加法 其运算方法是目标图像 图像1 图像2运算结果进行取模运算 当像素值 小于等于 255 时结果为“图像1 图像2”例如12048168当像素值 大于255 时结果为对255取模的结果例如255 64 % 255 64 OpenCV的加法 其运算方法是目标图像 cv2.add图像1 图像2 当像素值 小于等于 255 时结果为“图像1 图像2”例如12048168当像素值 大于255 时结果为255例如255 64 255 两种方法对应的代码如下 # encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt# 读取图片 img cv2.imread(logo1.jpg) test img# 方法一Numpy加法运算 result1 img test# 方法二OpenCV加法运算 result2 cv2.add(img, test)all_pic np.column_stack((img, result1, result2))# 显示图像 cv2.imshow(img result1 result2, all_pic) # cv2.imshow(original, img) # cv2.imshow(result1, result1) # cv2.imshow(result2, result2)# 等待显示 cv2.waitKey(0) cv2.destroyAllWindows() 原图及其效果图如下 其中result1为Numpy的方法result2为OpenCV的方法。 1.2 图像混合 图像融合通常是指将2张或者两张以上的图像信息融合到1张图像上融合的图像含有更多的信息能够更方便人们观察或计算机处理。 图像融合是在图像加法的基础上增加了系数和亮度调节量。 图像融合目标图像 图像1*系数1 图像2*系数2 亮度调节量 图像混合 cv2.addWeighted() 也是一种图片相加的操作只不过两幅图片的权重不一样 y 相当于一个修正值 dst α*img1 β*img2 γ PS当 alpha 和 beta 都等于1则相当于图片相加。 代码如下 import cv2 import numpy as npimg1 cv2.imread(lena_small.jpg) img2 cv2.imread(opencv_logo_white.jpg) # print(img1.shape, img2.shape) # (187, 186, 3) (184, 193, 3) img2 cv2.resize(img2, (186, 187)) # print(img1.shape, img2.shape) res cv2.addWeighted(img1, 0.6, img2, 0.4, 0) cv2.imshow(res, res) cv2.waitKey(0) cv2.destroyAllWindows() 注意这里两张图片的尺寸必须一致。原图和结果图如下 1.3 图像矩阵减法 图像矩阵减法与加法其实类似我们这不多做说明只贴函数 函数原型cv2.subtract(src1, src2, dstNone, maskNone, dtypeNone)src1图像矩阵1src1图像矩阵2dst默认选项mask默认选项dtype默认选项 1.4 按位运算 按位操作有AND OR NOTXOR 等。cv2.bitwise_and(), cv2.bitwise_not(), cv2.bitwise_or(), cv2.bitwise_xor()分别执行按位与/或/非/异或运算。下面我们贴一下opencv中的函数 bitwise_or—图像或运算函数原型cv2.bitwise_or(src1, src2, dstNone, maskNone)src1图像矩阵1src1图像矩阵2dst默认选项mask默认选项bitwise_xor—图像异或运算函数原型bitwise_xor(src1, src2, dstNone, maskNone)src1图像矩阵1src1图像矩阵2dst默认选项mask默认选项bitwise_not—图像非运算函数原型bitwise_not(src1, src2, dstNone, maskNone)src1图像矩阵1src1图像矩阵2dst默认选项mask默认选项 掩膜就是用来对图片进行全局或局部的遮挡当我们提取图像的一部分选择非矩阵ROI时这些操作会很有用常用于Logo投射。 通过 threshold 函数将图片固定阈值二值化图像二值化定义将图像上的像素点的灰度值设置为0或255也就是将整个图像呈现出明显的黑和白的视觉效果 一幅图像包括目标物体背景还有噪声要想从多值的数字图像中直接提取出目标物体常用的方法就是设定一个阈值T用 T 将图像的数据分为两部分大于 T 的像素群和小于 T 的像素群。这是研究灰度变换的最特殊的方法称为图像二值化Binarization 下面做一个例子关于Logo投射。下面首先展示两张照片一张原图一张logo图目的是投射logo到原图上 思路如下我们的目的是把 logo 放在左边所以我们只关心这一块区域下面我们的目的是创建掩码这是在Logo图上并且保留除了logo以外的背景这是在原图然后进行融合这是在原图最后融合放在原图。 代码如下 # _*_coding:utf-8_*_ import cv2 import numpy as npimg_photo cv2.imread(james.jpg) img_logo cv2.imread(logo1.jpg)print(img_logo.shape, img_photo.shape) # (615, 327, 3) (640, 1024, 3)rows, cols, channels img_logo.shape photo_roi img_photo[0:rows, 0:cols]gray_logo cv2.cvtColor(img_logo, cv2.COLOR_BGR2GRAY) # 中值滤波 midian_logo cv2.medianBlur(gray_logo, 5) # mask_bin 是黑白掩膜 ret, mask_bin cv2.threshold(gray_logo, 127, 255, cv2.THRESH_BINARY)# mask_inv 是反色黑白掩膜 mask_inv cv2.bitwise_not(mask_bin)# 黑白掩膜 和 大图切割区域 去取和 img_photo_bg_mask cv2.bitwise_and(photo_roi, photo_roi, maskmask_bin)# 反色黑白掩膜 和 logo 取和 img2_photo_fg_mask cv2.bitwise_and(img_logo, img_logo, maskmask_inv)dst cv2.add(img_photo_bg_mask, img2_photo_fg_mask)img_photo[0:rows, 0:cols] dstcv2.imshow(mask_bin, mask_bin) cv2.imshow(mask_inv, mask_inv) cv2.imshow(img_photo_bg_mask, img_photo_bg_mask) cv2.imshow(img2_photo_fg_mask, img2_photo_fg_mask) cv2.imshow(img_photo, img_photo) cv2.waitKey(0) cv2.destroyAllWindows() 图示过程如下 下面第一张是黑色是因为 背景图中 左边就是黑色所以这里不显示而已。 最终形态如下 2掩膜mask 掩膜的基本概念 定义掩膜通常是一个与原始图像大小相同的二值或布尔图像其中选定的区域被标记为1或True而其余区域被标记为0或False。 用途当对图像应用一个操作如滤波、边缘检测、区域提取、图像增强等时掩膜可以用来限制这个操作只在图像的特定区域内发生。 掩膜的应用示例 图像过滤在进行图像滤波处理时可以使用掩膜来定义滤波器只应用于图像的特定区域。 特征提取在进行特征提取时可以使用掩膜来仅从图像的某些特定区域提取特征。 图像融合在图像融合应用中可以用掩膜来指定哪些部分的像素应该从一个图像中取哪些部分的像素应该从另一个图像中取。 图像分割在图像分割中掩膜可以用来标记和区分不同的区域例如在医学图像处理中标记不同的组织类型。 掩模是 8 位单通道图像 (灰度图 / 二值图) 掩模某个位置如果为 0则在此位置上的操作不起作用 掩模某个位置如果不为 0则在此位置上的操作会起作用即 ROI 区域 可以用来提取不规则 ROI 在有些图像处理的函数中有的参数里面会有 mask 参数即此函数支持掩膜操作。 首先我们要理解什么是掩膜其次掩膜有什么作用呢 2.1 掩膜mask的概念 简单来说掩膜是用一副二值化图片对另外一幅图片进行局部的遮挡。 首先我们从物理的角度来看看 mask 到底是什么过程。 数字图像处理中的掩膜的概念是借鉴于 PCB 制版的过程在半导体制作中许多芯片工艺步骤采用光刻技术用于这些步骤的图形”底片”称为掩膜也称为“掩模”其作用是在硅片上选定的区域中对一个不透明的图形模板遮盖继而下面的腐蚀或扩散将只影响选定的区域意外的区域。 图形掩膜Image mask与其类似用选定的图形图形或物体对处理的图像全部或局部进行遮挡来控制图像处理的区域或处理过程。用于覆盖的特点图像或物体称为掩膜或模板。光学图像处理中掩膜可以足胶片滤光片等。掩膜是由0和1组成的一个二进制图像。当在某一功能中应用掩膜时1值区域被处理被屏蔽的0值区域不被包括在计算中。通过制定的数据值数据范围有限或无限值感兴趣区和注释文件来定义图像掩膜也可以应用上述选项的任意组合作为输入来建立掩膜。 2.2 掩膜的作用 数字图像处理中掩膜为二维矩阵数组有时也用多值图像图像掩膜主要用于 1提取感兴趣区用预先制作的感兴趣区掩膜与待处理图像相乘得到感兴趣区图像感兴趣区内图像值保持不变而区外图像值都为零。2屏蔽作用用掩膜对图像上某些区域做屏蔽使其不参加处理或不参加处理参数的计算或仅对屏蔽区做处理或统计。3结构特征提取用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征。4特殊性质图像的制作 掩膜是一种图像滤镜的模板试用掩膜经常处理的是遥感图像。当提取道路或者河流或者房屋时通过一个 N*N 的矩阵来对图像进行像素过滤然后将我们需要的地物或者标志突出显示出来这个矩阵就是一种掩膜。在OpenCV中掩膜操作时相对简单的。大致的意思是通过一个掩膜矩阵重新计算图像中的每一个像素值。掩膜矩阵控制了旧图像当前位置以及周围位置像素对新图像当前位置像素值的影响力度。用数学术语将即我们自定义一个权重表。 在所有图像基本运算的操作函数中凡是带有掩膜mask的处理函数其掩膜都参与运算输入图像运算完之后再与掩膜图像或矩阵运算。 2.3 通过掩膜操作实现图像对比图的改变 矩阵的掩膜操作非常简单根据掩膜来重新计算每个像素的像素值掩膜mask也被称为内核。 什么是图和掩膜的与运算呢 其实就是原图中的每个像素和掩膜中的每个对应像素进行与运算。比如1 1 11 0 0 比如一个 3*3 的图像与 3*3 的掩膜进行运算得到的结果图像就是 说白了mask就是位图来选择哪个像素允许拷贝哪个像素不允许拷贝如果mask像素的值时非0的我们就拷贝它否则不拷贝。 2.4 mask小结 1图像中各种位运算比如与或非运算与普通的位运算类似。 2如果用一句话总结掩膜就是两幅图像之间进行的各种位运算操作。 代码 #_*_coding:utf-8_*_ import cv2 import numpy as npdef mask_processing(path):image cv2.imread(path) # 读图# cv2.imshow(Oringinal, image) #显示原图print(image.shape[:2]) # (613, 440)# 输入图像是RGB图像故构造一个三维数组四个二维数组是mask四个点的坐标site np.array([[[300, 280], [150, 280], [150, 50], [300, 50]]], dtypenp.int32)im np.zeros(image.shape[:2], dtypeuint8) # 生成image大小的全白图cv2.polylines(im, site, 1, 255) # 在im上画site大小的线1表示线段闭合255表示线段颜色cv2.fillPoly(im, site, 255) # 在im的site区域填充颜色为255mask imcv2.namedWindow(Mask, cv2.WINDOW_NORMAL) # 可调整窗口大小不加这句不可调整cv2.imshow(Mask, mask)masked cv2.bitwise_and(image, image, maskmask) # 在模板mask上将image和image做“与”操作cv2.namedWindow(Mask to Image, cv2.WINDOW_NORMAL) # 同上cv2.imshow(Mask to Image, masked)cv2.waitKey(0) # 图像一直显示键盘按任意键即可关闭窗口cv2.destroyAllWindows()if __name__ __main__:path irving.jpgmask_processing(path) 代码说明 1考虑到当图像尺寸太大所以我们用 cv2.namedWindow() 函数可以指定窗口是否可以调整大小。在默认情况下标志为 cv2.WINDOW_AUTOSIZE。但是如果指定标志为 cv2.WINDOW_Normal则可以调整窗口的大小这些操作可以让我们的工作更方便一些。 2对坐标轴的理解上面代码中的四个坐标从第一个到最后一个分别对应下图中的 x1 x2 x4 x3。我实际实验是这样的如果有不同想法可以交流。 原图如下 mask与处理后图的结果如下 3边界填充在做深度学习需要填充边界。边缘填充是什么呢 因为对于图像的卷积操作最边缘的像素一般无法处理所以卷积核中心倒不了最边缘像素。这就需要先将图像的边界填充再根据不同的填充算法进行卷积操作得到的新图像就是填充后的图像。 如果你想在图像周围创建一个边就像相框一样你可以使用 cv2.copyMakeBorder() 函数这经常在卷积运算或 0 填充时被用到这个函数如下 def copyMakeBorder(src, top, bottom, left, right, borderType, dstNone, valueNone): 参数解释 src输入图像topbuttomleftright 对应边界的像素数目分别为图像上面 下面 左面右面填充边界的长度borderType 要添加哪种类型的边界类型如下 ——cv2.BORDER_CONSTANT 添加有颜色的常数值边界还需要下一个参数value ——cv2.BORDER_REFLECT 边界元素的镜像反射法即以最边缘的像素为对称轴。比如: fedcba|abcdefgh|hgfedcb ——cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟BORDER_REFLECT类似但是由区别。例如: gfedcb|abcdefgh|gfedcba ——cv2.BORDER_REPLICATE 复制法重复最后一个元素。例如: aaaaaa|abcdefgh|hhhhhhh ——cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh|abcdefgh|abcdefg value 边界颜色通常用于常量法填充中即边界的类型是 cv2.BORDER_CONSTANT 为了更好的理解这几种类型请看下面代码演示 import cv2 import numpy as np import matplotlib.pyplot as plt# 读取图片 img cv2.imread(kd1.jpg) # (221, 405, 3) # img cv2.imread(lena.jpg) # (263, 263, 3) # print(img.shape)# 各个边界需要填充的值, 为了展示效果这里填充的大一些 top_size, bottom_size, left_size, right_size (50, 50, 50, 50)# 复制法 重复边界填充 即复制最边缘像素 replicate cv2.copyMakeBorder(img, top_size, bottom_size,left_size, right_size,borderTypecv2.BORDER_REPLICATE)# 反射法 反射边界填充 即对感兴趣的图像中的像素在两边进行复制 # 例如 fedcba|abcdefgh|hgfedcb reflect cv2.copyMakeBorder(img, top_size, bottom_size,left_size, right_size,borderTypecv2.BORDER_REFLECT)# 反射101边界法 反射101边界填充 这个是以最边缘为轴对称 # 例如 gfedcb|abcdefg|gfedcba reflect101 cv2.copyMakeBorder(img, top_size, bottom_size,left_size, right_size,borderTypecv2.BORDER_REFLECT_101)# 外包装法 填充 # 例如 cdefgh|abcdefgh|abcdegf wrap cv2.copyMakeBorder(img, top_size, bottom_size,left_size, right_size,borderTypecv2.BORDER_WRAP)# 常量法常数值填充 常量值可以自己设定 value0 constant cv2.copyMakeBorder(img, top_size, bottom_size,left_size, right_size,borderTypecv2.BORDER_CONSTANT,value(0, 255, 0))plt.subplot(231) plt.imshow(img, gray) plt.title(origin)plt.subplot(232) plt.imshow(replicate, gray) plt.title(replicate)plt.subplot(233) plt.imshow(reflect, gray) plt.title(reflect)plt.subplot(234) plt.imshow(reflect101, gray) plt.title(reflect101)plt.subplot(235) plt.imshow(wrap, gray) plt.title(wrap)plt.subplot(236) plt.imshow(constant, gray) plt.title(constant)plt.show() 原图1如下 处理的效果图如下 效果2如下 注意plt.imshow() 显示图片色差问题 我们都知道 cv2.imshow() 显示的原始图片是BGR格式即原图如下所示 那通过opencv将BGR格式转换为RGB格式图显示如下 这就解释了为什么plt.imshow()显示图片色差问题原因就是读取图片的通道不同。 3.1 细节函数 为了能快速对比出各个方法得出的图像的区别可以使用np.vstack()或者np.hstack()对比将图像放在同一个窗口。 recnp.hstack((replicate,reflect)) cv_show(replicate_reflect,rec) 注意使用np.vstack()或者np.hstack()函数时图像的大小必须一致不然会报错。                   使用np.vstack()或者np.hstack()函数时可能会出现图像显示不完全情况 4图像阈值二值化 二值化英语Thresholding是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值的像素灰度设为灰度极大值把小于这个值的像素灰度设为灰度极小值从而实现二值化。 根据阈值选取的不同二值化的算法分为固定阈值和自适应阈值。 比较常用的二值化方法则有双峰法、P参数法、迭代法和OTSU法等。 4.1 图像二值化原理 二值化核心思想设阈值大于阈值的为0黑色或 255白色使图像称为黑白图。 阈值可固定也可以自适应阈值。 自适应阈值一般为一点像素与这点为中序的区域像素平均值或者高斯分布加权和的比较其中可以设置一个差值也可以不设置。 图像的阈值化旨在提取图像中的目标物体将背景以及噪声区分开来。通常会设定一个阈值T通过T将图像的像素分为两类大于T的像素群和小于T的像素群。 灰度转换处理后的图像中每个像素都只有一个灰度值其大小表示明暗程度。所谓图像的二值化 就是将图像上的像素点的灰度值设置为0或255也就是将整个图像呈现出明显的只有黑和白的视觉效果。一幅图像包括目标物体、背景还有噪声要想从多值的数字图像中直接提取出目标物体。 常用的二值化算法下所示 当灰度Gray小于阈值T的时候其像素设置为0表示黑色当灰度Gray大于或等于阈值T时其Y值为255表示白色。 全局阈值就是一幅图像包括目标物体、背景还有噪声要想从多值的数字图像中直接提取出目标物体常用的方法就是设定一个阈值T用T将图像的数据分成两部分大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法称为图像的二值化Binarization。 局部阈值就是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值从而使我们能在亮度不同的情况下得到更好的结果。 二值化处理广泛应用于各行各业比如生物学中的细胞图分割交通领域的车牌设计等。在文化应用领域中通过二值化处理将所需民族文物图像转换为黑白两色图从而为后面的图像识别提供更好的支撑作用。 4.2 简单阈值处理全局阈值 Python-OpenCV中提供了阈值threshold函数 threshold(src, thresh, maxval, type, dstNone) 变量的作用 第一个参数 src 指原图像原图像应该是灰度图只能输入单通道图像第二个参数 thresh 指用来对像素值进行分类的阈值第三个参数 maxval 指当像素值高于有时是小于根据 type 来决定阈值时应该被赋予的新的像素值在二元阈值THRESH_BINARY和逆二元阈值THRESH_BINARY_INV中使用的最大值第四个参数 dst 指不同的不同的阈值方法这些方法包括以下五种类型 cv2.THRESH_BINARY 超过阈值部分取 maxval最大值否则取 0 cv2.THRESH_BINARY_INV THRESH_BINARY 的反转 cv2.THRESH_TRUNC     大于阈值部分设为阈值否则不变 cv2.THRESH_TOZERO 大于阈值部分不改变否则设为零 cv2.THRESH_TOZERO_INV THRESH_TOZERO 的反转 图来自https://blog.csdn.net/whl970831/article/details/98231314 https://blog.csdn.net/Eastmount/article/details/83548652 详细解析如下 用函数表示如下 对应OpenCV提供的五张图如下第一张为原图后面依次为二进制阈值化反二进制阈值化截断阈值化反阈值化为0阈值化为0. 代码如下 # _*_coding:utf-8_*_ import cv2 import numpy as np from matplotlib import pyplot as pltdef parse_thresh(path):img cv2.imread(path) # 读取原始照片gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, thresh1 cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)ret, thresh2 cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)ret, thresh3 cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)ret, thresh4 cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)ret, thresh5 cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)titles [Origin Image, gray, BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV] # 标题images [img, gray, thresh1, thresh2, thresh3, thresh4, thresh5] # 对应的图for i in range(7): # 画7次图plt.subplot(2, 4, i 1), plt.imshow(images[i], gray)plt.title(titles[i])plt.xticks([]), plt.yticks([])plt.show()if __name__ __main__:path durant.jpgparse_thresh(path) 结果如下 4.3 自适应阈值处理局部阈值   Python-OpenCV提供了自适应阈值函数 cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dstNone) 参数意义 第一个参数 src 指原图像原图像应该是灰度图。第二个参数 x 指当像素值高于有时是小于阈值时应该被赋予的新的像素值第三个参数 adaptive_method 参数为 CV_ADAPTIVE_THRESH_MEAN_C     CV_ADAPTIVE_THRESH_GAUSSIAN_C 第四个参数 threshold_type 指取阈值类型必须是下者之一 CV_THRESH_BINARY     CV_THRESH_BINARY_INV 第五个参数 block_size 指用来计算阈值的象素邻域大小: 3, 5, 7, …第六个参数 param1 指与方法有关的参数。 对方法CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C 它是一个从均值或加权均值提取的常数, 尽管它可以是负数。     对方法CV_ADAPTIVE_THRESH_MEAN_C先求出块中的均值再减掉param1。     对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C 先求出块中的加权和(gaussian) 再减掉param1。 代码如下 import cv2 from matplotlib import pyplot as plt #详细说明参考上方例子img cv2.imread(sss.jpg,0) img cv2.medianBlur(img,5)ret,th1 cv2.threshold(img,127,255,cv2.THRESH_BINARY)th2 cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\cv2.THRESH_BINARY,11,2)th3 cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\cv2.THRESH_BINARY,11,2)titles [Original Image, Global Thresholding (v 127),Adaptive Mean Thresholding, Adaptive Gaussian Thresholding] images [img, th1, th2, th3]for i in range(4):plt.subplot(2,2,i1),plt.imshow(images[i],gray)plt.title(titles[i])plt.xticks([]),plt.yticks([]) plt.show() 综合代码 import cv2 as cv#全局阈值 def threshold_demo(image):gray cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化ret, binary cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE) #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。#print(threshold value %s%ret)cv.namedWindow(threshold, cv.WINDOW_NORMAL)cv.imshow(threshold, binary)#局部阈值 def local_threshold(image):gray cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化binary cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY, 25, 10) #自适应阈值化能够根据图像不同区域亮度分布改变阈值cv.namedWindow(adaptiveThreshold, cv.WINDOW_NORMAL)cv.imshow(adaptiveThreshold, binary)src cv.imread(sss.jpg) cv.namedWindow(input_image, cv.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放cv.imshow(input_image, src) #源图 threshold_demo(src) #全局 local_threshold(src) #局部cv.waitKey(0) cv.destroyAllWindows() 5 Otsu 二值化 在使用全局阈值时我们就是随便给了一个数来做阈值那我们怎么知道我们选取的这个数的好坏呢答案就是不停的尝试。如果是一副双峰图像简单来说双峰图像是指图像直方图中存在两个峰呢我们岂不是应该在两个峰之间的峰谷选一个值作为阈值这就是 Otsu 二值化要做的。简单来说就是对一副双峰图像自动根据其直方图计算出一个阈值。对于非双峰图像这种方法得到的结果可能会不理想。   这里用到到的函数还是 cv2.threshold()但是需要多传入一个参数flagcv2.THRESH_OTSU。   这时要把阈值设为 0。然后算法会找到最优阈值这个最优阈值就是返回值 retVal。如果不使用 Otsu 二值化返回的retVal 值与设定的阈值相等。   下面的例子中输入图像是一副带有噪声的图像。第一种方法设127 为全局阈值。第二种方法直接使用 Otsu 二值化。第三种方法先使用一个 5x5 的高斯核除去噪音然后再使用 Otsu 二值化。 代码 import cv2 from matplotlib import pyplot as pltimg cv2.imread(sss.jpg,0)# 设127 为全局阈值 ret1,th1 cv2.threshold(img,127,255,cv2.THRESH_BINARY)# 直接使用 Otsu 二值化 ret2,th2 cv2.threshold(img,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU)# 先使用一个 5x5 的高斯核除去噪音然后再使用 Otsu 二值化 blur cv2.GaussianBlur(img,(5,5),0) ret3,th3 cv2.threshold(blur,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU)images [img, 0, th1,img, 0, th2,blur, 0, th3] titles [Original Noisy Image,Histogram,Global Thresholding (v127),Original Noisy Image,Histogram,Otsus Thresholding,Gaussian filtered Image,Histogram,Otsus Thresholding]for i in range(3):plt.subplot(3,3,i*31),plt.imshow(images[i*3],gray)plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])plt.subplot(3,3,i*32),plt.hist(images[i*3].ravel(),256)plt.title(titles[i*31]), plt.xticks([]), plt.yticks([])plt.subplot(3,3,i*33),plt.imshow(images[i*32],gray)plt.title(titles[i*32]), plt.xticks([]), plt.yticks([]) plt.show() 5.1 Otsu 最大类间方差法原理 OTSU 算法是由日本学者 OTSU 于 1979 年提出的一种对图像进行二值化的高效算法。OTSU算法又叫大津算法其本质是最大类间方差法。 它的原理是利用阈值将原图像分为前景背景两个图像。 前景用 n1csumm1 来表示在当前阈值下的前景的点数质量距平均灰度。 背景用n2sum-csumm2 来表示在当前阈值下的背景的点数质量距平均灰度。 当取最佳阈值时背景应该与前景差别最大关键在于如何选择衡量差别的标准而在otsu算法中这个衡量差别的标准就是最大类间方差。 5.2 Otsu 最大类间方差法的性能 类间方差法对噪音和目标大小十分敏感它仅对类间方差为单峰的图像产生较好的分割效果。 当目标与背景的大小比例悬殊时类间方差准则可能呈现双峰或多峰此时效果不好但是类间方差法是用时最少的。 5.3 Otsu 最大类间方差法的公式推导 记 t 为前景与背景的分割阈值前景点数占图像比例为 w0平均灰度为 u0背景点数占图像比例为 w1平均灰度为 u1. 则图像的总平均灰度为 u w0 * u0 w1 * u1 前景和背景图像的方差g w0 * (u0 - u) * (u0 - u) w1 * (u1 - u) * (u1 - u) w0 * w1 * (u0 - u1) * (u0 - u1) 当方差 g 最大时可以认为此时前景和背景差异最大此时的灰度 t 是最佳阈值 sb w0 * w1*(u1 - u0)*(u0 - u1) 代码实现 # _*_coding:utf-8_*_ import cv2 import numpy as npdef max_class_threshold_variance(origin_photo):img cv2.imread(origin_photo, -1)gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)retval, dst cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)cv2.imshow(src, img)cv2.imshow(gray, gray)cv2.imshow(dst, dst)cv2.waitKey(0) 5.4 Otsu’ ’s 二值化是如何工作的 在这一部分我们会演示怎样使用 Python 来实现 Otsu 二值化算法从而告诉大家它是如何工作的。如果你不感兴趣的话可以跳过这一节。因为是双峰图Otsu 算法就是要找到一个阈值t, 使得同一类加权方差最小需要满足下列关系式 其中 其实就是在两个峰之间找到一个阈值 t将这两个峰分开并且使每一个峰内的方差最小。实现这个算法的 Python 代码如下 img cv2.imread(noisy2.png,0) blur cv2.GaussianBlur(img,(5,5),0)# find normalized_histogram, and its cumulative distribution function hist cv2.calcHist([blur],[0],None,[256],[0,256]) hist_norm hist.ravel()/hist.max() Q hist_norm.cumsum()bins np.arange(256)fn_min np.inf thresh -1for i in xrange(1,256):p1,p2 np.hsplit(hist_norm,[i]) # probabilitiesq1,q2 Q[i],Q[255]-Q[i] # cum sum of classesb1,b2 np.hsplit(bins,[i]) # weights# finding means and variancesm1,m2 np.sum(p1*b1)/q1, np.sum(p2*b2)/q2v1,v2 np.sum(((b1-m1)**2)*p1)/q1,np.sum(((b2-m2)**2)*p2)/q2# calculates the minimization functionfn v1*q1 v2*q2if fn fn_min:fn_min fnthresh i# find otsus threshold value with OpenCV function ret, otsu cv2.threshold(blur,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU) prin(thresh,ret)
http://www.zqtcl.cn/news/651245/

相关文章:

  • 曲阜住房城乡建设局网站php用什么工具做网站
  • 深圳网站开发奇辰科技视觉vi设计系统
  • 网站开发与管理期末考试工商年检在哪个网站做
  • 网站建设有什么系统深圳微网站
  • 网站建设算什么专业企业建设网站需要注意什么
  • 太原cms建站模板建设部网站监理注销查询
  • 流量对网站排名的影响因素网站内容的作用
  • 彩钢做网站能赚钱吗合肥市住房和城乡建设厅
  • 顺德网站建设itshunde罗村建网站
  • 网站开发语言开发十大免费货源网址
  • 网站建设要那些收费项如何做自己的淘客网站
  • 郴州文明网网站网站设计策划书3000字
  • 免费学习资源网站网站维护得多久
  • 电子商务网站建设考试重点长沙网站推广平台
  • 商业性质网站建设步骤佛山企业网站优化
  • 做网站投入网站设计与开发未来发展方向
  • 网站seo优化外包顾问网站ip解析
  • 贵阳建网站公司兼职网站推广如何做
  • 建设企业网站公司价格page做网站
  • 直播网站建设模板跨境电商选品
  • 购物网站有哪些shop++是什么
  • 自动化优化系统网站建设网站建设类文章
  • 网站建设以及推广提案书支付通道网站怎么做
  • 上海兼职做网站凤凰军事新闻
  • 青田建设局网站ui培训哪好
  • 佛山网站seo哪家好全返网站建设
  • 快速建站哪个平台好常见网页设计
  • 织梦网站地图模板网站服务费
  • 织梦建设两个网站 视频互联网公司排名1000
  • 广州企业网站设计西昌手机网