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

c 网站开发无锡企业网站制作

c 网站开发,无锡企业网站制作,外贸平台排行榜,海南网站建设哪家好Python-OpenCV中的图像处理-直方图 直方图统计直方图绘制直方图Matplotlib绘制灰度直方图Matplotlib绘制RGB直方图 使用掩膜统计直方图直方图均衡化Numpy图像直方图均衡化OpenCV中的直方图均衡化CLAHE 有限对比适应性直方图均衡化 2D直方图OpenCV中的2D直方图Numpy中2D直方图 直… Python-OpenCV中的图像处理-直方图 直方图统计直方图绘制直方图Matplotlib绘制灰度直方图Matplotlib绘制RGB直方图 使用掩膜统计直方图直方图均衡化Numpy图像直方图均衡化OpenCV中的直方图均衡化CLAHE 有限对比适应性直方图均衡化 2D直方图OpenCV中的2D直方图Numpy中2D直方图 直方图反射投影Numpy 中的直方图反射投影算法OpenCV中的直方图反射投影算法 直方图 通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值 0 到 255 y 轴是图片中具有同一个灰度的点的数目。BINS上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到255你就需要 256 个数来显示上面的直方图。但是如果你不需要知道每一个像素值的像素点数目的而只希望知道两个像素值之间的像素点数目怎么办呢举例来说我们想知道像素值在 0 到 15 之间的像素点的数目接着是 16 到31,… 240 到 255。我们只需要 16 个值来绘制直方图。DIMS表示我们收集数据的参数数目。在本例中我们对收集到的数据只考虑一件事灰度值。所以这里就是 1。RANGE就是要统计的灰度值范围一般来说为 [0 256]也就是说所有的灰度值。 统计直方图 cv2.calcHist()OpenCV统计直方图 cv2:calcHist(images; channels; mask; histSize; ranges[; hist[; accumulate]]) images: 原图像图像格式为 uint8 或 float32。当传入函数时应该 用中括号 [] 括起来例如 [img]。channels: 同样需要用中括号括起来它会告诉函数我们要统计那幅图 像的直方图。如果输入图像是灰度图它的值就是 [0]如果是彩色图像 的话传入的参数可以是 [0] [1] [2] 它们分别对应着通道 B G R。mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如 果你想统计图像某一部分的直方图的话你就需要制作一个掩模图像并 使用它。后边有例子histSize:BIN 的数目。也应该用中括号括起来例如 [256]。ranges: 像素值范围通常为 [0 256] img cv2.imread(‘home.jpg’,0) #别忘了中括号 [img],[0],None,[256],[0,256]只有 mask 没有中括号 hist cv2.calcHist([img],[0],None,[256],[0,256]) hist 是一个 256x1 的数组每一个值代表了与次灰度值对应的像素点数目。 np.histogram()Numpy统计直方图np.bincount():Numpy统计直方图(一维直方图速度快) #img.ravel() 将图像转成一维数组这里没有中括号。 hist,bins np.histogram(img.ravel(),256,[0,256]) Numpy 还 有 一 个 函 数 np.bincount() 它 的 运 行 速 度 是 np.histgram 的 十 倍。 所 以 对 于 一 维 直 方 图 我 们 最 好 使 用 这 个函 数。 使 用 np.bincount 时 别 忘 了 设 置 minlength256。 histnp.bincount(img.ravel() minlength256) 绘制直方图 Matplotlib绘制灰度直方图 import numpy as np import cv2 from matplotlib import pyplot as pltimg cv2.imread(./resource/opencv/image/leuvenA.jpg, cv2.IMREAD_GRAYSCALE) plt.hist(img.ravel(), 256, [0, 256]) plt.show()Matplotlib绘制RGB直方图 import numpy as np import cv2 from matplotlib import pyplot as pltimg cv2.imread(./resource/opencv/image/leuvenA.jpg, cv2.IMREAD_COLOR)color (b, g, r)for i, col in enumerate(color):histr cv2.calcHist([img], [i], None, [256], [0, 256])plt.plot(histr, color col)plt.xlim([0, 256]) plt.show() 使用掩膜统计直方图 要统计图像某个局部区域的直方图只需要构建一副掩模图像。将要统计的部分设置成白色其余部分为黑色就构成了一副掩模图像。然后把这个掩模图像传给函数就可以了。 import numpy as np import cv2 from matplotlib import pyplot as pltimg cv2.imread(./resource/opencv/image/leuvenA.jpg, cv2.IMREAD_GRAYSCALE) h,w img.shape print(h,w)# create mask mask np.zeros(img.shape[:2], np.uint8) mask[100:400, 100:500] 255 masked_img cv2.bitwise_and(img, img, mask mask)hist_full cv2.calcHist([img], [0], None, [256], [0, 256]) hist_mask cv2.calcHist([img], [0], mask, [256], [0, 256])plt.subplot(221), plt.imshow(img, gray) plt.subplot(222), plt.imshow(mask, gray) plt.subplot(223), plt.imshow(masked_img, gray) plt.subplot(224), plt.plot(hist_full, r), plt.plot(hist_mask, b) plt.xlim([0, 256]) plt.show() 红色线是整幅图的直方图蓝色线是掩膜之后的直方图 直方图均衡化 如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢例如如果一幅图片整体很亮那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很广泛。所以你应该把它的直方图做一个横向拉伸如下图这就是直方图均衡化要做的事情。通常情况下这种操作会改善图像的对比度。 直方图均衡化处理可以提高图像的清晰度 Numpy图像直方图均衡化 import numpy as np import cv2 from matplotlib import pyplot as pltimg cv2.imread(./resource/opencv/image/leuvenA.jpg, cv2.IMREAD_GRAYSCALE)# 1.使用Numpy统计原图直方图 # flatten() 将数组变成一维 hist, bins np.histogram(img.flatten(), 256, [0, 256]) # 计算累积分布图 cdf hist.cumsum() cdf_normalized cdf * hist.max() / cdf.max()# 2.使用Numpy直方图均衡化处理 # 构建 Numpy 掩模数组 cdf 为原数组当数组元素为 0 时掩盖计算时被忽略。 cdf_m np.ma.masked_equal(cdf, 0) cdf_m (cdf_m - cdf_m.min()) *255/(cdf_m.max() - cdf_m.min()) # 对被掩盖的元素赋值这里赋值为 0 cdf np.ma.filled(cdf_m, 0).astype(uint8) # 现在就获得了一个表我们可以通过查表得知与输入像素对应的输出像素的值。我们只需要把这种变换应用到图像上就可以了 img2 cdf[img]# 3. 绘制原图直方图 plt.subplot(221), plt.imshow(cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)) plt.subplot(222) plt.plot(cdf_normalized, colorb) plt.hist(img.flatten(), 256, [0, 256], colorr) plt.xlim([0, 256]) plt.legend((cdf, histogram), locupper left)# 4.绘制均衡化直方图 plt.subplot(223), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_GRAY2RGB)) plt.subplot(224) plt.plot(cdf_m, colorg) plt.hist(img2.flatten(), 256, [0, 256], colorr) plt.xlim([0, 256]) plt.legend((cdf, histogram), locupper left)plt.show()OpenCV中的直方图均衡化 OpenCV 中的直方图均衡化函数为 cv2.equalizeHist()。这个函数的输入图片仅仅是一副灰度图像输出结果是直方图均衡化之后的图像。 import numpy as np import cv2img cv2.imread(./resource/opencv/image/leuvenA.jpg, cv2.IMREAD_GRAYSCALE) # 直方图均衡化 equ cv2.equalizeHist(img) # 图像拼接左边原图右边直方图均衡化之后的图像 res np.hstack((img, equ))cv2.imshow(img, res) cv2.waitKey(0) cv2.destroyAllWindows()左边原图右边直方图均衡化之后的图像 CLAHE 有限对比适应性直方图均衡化 文章上边做的直方图均衡化会改变整个图像的对比度但是在很多情况下这样做的效果并不好。例如下图分别是输入图像和进行直方图均衡化之后的输出图像。的确在进行完直方图均衡化之后图片背景的对比度被改变了。但是你再 对比一下两幅图像中雕像的面图由于太亮我们丢失了很多信息。 为了解决这个问题我们需要使用自适应的直方图均衡化。这种情况下整幅图像会被分成很多小块这些小块被称为“tiles”在 OpenCV 中 tiles 的大小默认是 8x8然后再对每一个小块分别进行直方图均衡化跟前面类似。所以在每一个的区域中直方图会集中在某一个小的区域中除非有噪声干扰。如果有噪声的话噪声会被放大。为了避免这种情况的出现要使用对比度限制。对于每个小块来说如果直方图中的 bin 超过对比度的上限的话就把其中的像素点均匀分散到其他 bins 中然后在进行直方图均衡化。最后为了去除每一个小块之间“人造的”由于算法造成边界再使用双线性差值对小块进行缝合。 import numpy as np import cv2 from matplotlib import pyplot as pltimg cv2.imread(./resource/opencv/image/clahe_2.jpg, cv2.IMREAD_GRAYSCALE)# 均衡化处理 equ cv2.equalizeHist(img)# 自适应均衡化处理 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) cl1 clahe.apply(img)# 绘制图像 plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)), plt.title(img) plt.subplot(132), plt.imshow(cv2.cvtColor(equ, cv2.COLOR_GRAY2RGB)), plt.title(equ) plt.subplot(133), plt.imshow(cv2.cvtColor(cl1, cv2.COLOR_GRAY2RGB)), plt.title(cl1) plt.show() 2D直方图 在前面的文章介绍了如何绘制一维直方图之所以称为一维是因为我们只考虑了图像的一个特征灰度值。但是在 2D 直方图中我们就要考虑两个图像特征。对于彩色图像的直方图通常情况下我们需要考虑每个的颜色 Hue和饱和度 Saturation。根据这两个特征绘制 2D 直方图。 OpenCV中的2D直方图 使用函数 cv2.calcHist() 来计算直方图既简单又方便。如果要绘制颜色直方图的话我们首先需要将图像的颜色空间从 BGR 转换到 HSV。记住计算一维直方图要从 BGR 转换到 HSV。计算 2D 直方图函数的参数要做如下修改 channels[0 1] 因为我们需要同时处理 H 和 S 两个通道。bins[180 256]H 通道为 180 S 通道为 256。range[0 180 0 256]H 的取值范围在 0 到 180 S 的取值范围在 0 到 256。 import numpy as np import cv2 from matplotlib import pyplot as pltimg cv2.imread(./resource/opencv/image/home.jpg, cv2.IMREAD_COLOR) hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hist cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), gray) plt.subplot(122), plt.imshow(hist, interpolation nearest) plt.show() Numpy中2D直方图 Numpy 同样提供了绘制 2D 直方图的函数 np.histogram()一维直方图np.histogram2d()二纬直方图 import numpy as np import cv2 from matplotlib import pyplot as pltimg cv2.imread(./resource/opencv/image/home.jpg, cv2.IMREAD_COLOR) hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) h, s, v cv2.split(hsv)#分离通道 hist, xbins, ybins np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.subplot(132), plt.imshow(hist) plt.show()直方图反射投影 直方图反向投影是由 Michael J. Swain 和 Dana H. Ballard 在他们的文章“Indexing via color histograms”中提出。它可以用来做图像分割或者在图像中找寻我们感兴趣的部分。简单来说它会输出与输入图像待搜索同样大小的图像其中的每一个像素值代表了输入图像上对应点属于目标对象的概率。用更简单的话来解释输出图像中像素值越高越白的点就越可能代表我们要搜索的目标在输入图像所在的位置。这是一个直观的解释。直方图投影经常与 camshift算法等一起使用。我们应该怎样来实现这个算法呢首先我们要为一张包含我们要查找目标的图像创建直方图在我们的示例中我们要查找的是草地其他的都不要。我们要查找的对象要尽量占满这张图像换句话说这张图像上最好是有且仅有我们要查找的对象。最好使用颜色直方图因为一个物体的颜色要比它的灰度能更好的被用来进行图像分割与对象识别。接着我们再把这个颜色直方图投影到输入图像中寻找我们的目标也就是找到输入图像中的每一个像素点的像素值在直方图中对应的概率这样我们就得到一个概率图像最后设置适当的阈值对概率图像进行二值化就这么简单。 Numpy 中的直方图反射投影算法 首先我们要创建两幅颜色直方图目标图像的直方图 ‘M’待搜索输入图像的直方图 ‘I’。 import numpy as np import cv2 from matplotlib import pyplot as pltroi cv2.imread(./resource/opencv/image/target.jpg, cv2.IMREAD_COLOR) hsv cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)target cv2.imread(./resource/opencv/image/messi5.jpg, cv2.IMREAD_COLOR) hsvt cv2.cvtColor(target, cv2.COLOR_BGR2HSV)M cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256]) I cv2.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256])# 计算比值 R M/I 。反向投影 R也就是根据 R 这个”调色板“创建一 # 副新的图像其中的每一个像素代表这个点就是目标的概率。 # 例如 B (x; y) R [h (x; y) ; s (x; y)] # 其中 h 为点 x y处的 hue 值 s 为点 x y处的 # saturation 值。最后加入再一个条件 B (x; y) min [B (x; y) ; 1] R M/Ih, s, v cv2.split(hsvt) B R[h.ravel(), s.ravel()] B np.minimum(B, 1) B B.reshape(hsvt.shape[:2])# 现在使用一个圆盘算子做卷积 B D × B其中 D 为卷积核 disc cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) B cv2.filter2D(B, -1, disc) B np.uint8(B)# 归一化处理 cv2.normalize(B,B,0,255,cv2.NORM_MINMAX) ret, thresh cv2.threshold(B, 50, 255, 0) # 别忘了是三通道图像因此这里使用 merge 变成 3 通道 thresh cv2.merge((thresh,thresh,thresh)) res cv2.bitwise_and(target, thresh)res np.hstack((target, thresh, res)) cv2.imshow(img, res) cv2.waitKey(0) cv2.destroyAllWindows()程序运行结果 target.jpg是另外一副图草地区域的一块截图 messi5.jpg OpenCV中的直方图反射投影算法 OpenCV 提供的函数 cv2.calcBackProject() 可以用来做直方图反向投影。它的参数与函数 cv2.calcHist 的参数基本相同。其中的一个参数是我们要查找目标的直方图。同样再使用目标的直方图做反向投影之前我们应该先对其做归一化处理。返回的结果是一个概率图像我们再使用一个圆盘形卷积核对其做卷操作最后使用阈值进行二值化。 import cv2 import numpy as nproi cv2.imread(./resource/opencv/image/target.jpg, cv2.IMREAD_COLOR) hsv cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)target cv2.imread(./resource/opencv/image/messi5.jpg, cv2.IMREAD_COLOR) hsvt cv2.cvtColor(target, cv2.COLOR_BGR2HSV)# calculating object histogram roihist cv2.calcHist([hsv], [0,1], None, [180, 256], [0, 180, 0, 256])# normalize histogram and apply backprojection # 归一化原始图像结果图像映射到结果图像中的最小值最大值归一化类型 #cv2.NORM_MINMAX 对数组的所有值进行转化使它们线性映射到最小值和最大值之间 # 归一化之后的直方图便于显示归一化之后就成了 0 到 255 之间的数了 cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX) dst cv2.calcBackProject([hsvt], [0, 1], roihist, [0, 180, 0, 256], 1)# Now convolute with circular disc # 此处卷积可以把分散的点连在一起 disc cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) dst cv2.filter2D(dst, -1, disc)# threshold and binary AND ret, thresh cv2.threshold(dst, 50, 255, 0) # 别忘了是三通道图像因此这里使用 merge 变成 3 通道 thresh cv2.merge((thresh,thresh,thresh)) res cv2.bitwise_and(target, thresh)res np.hstack((target, thresh, res)) cv2.imshow(img, res) cv2.waitKey(0) cv2.destroyAllWindows()程序运行结果 target.jpg是另外一副图草地区域的一块截图 messi5.jpg
http://www.pierceye.com/news/424457/

相关文章:

  • 沈阳网站设计江苏城乡建设部网站首页
  • 网站手机端生成wordpress如何下载
  • 网站数据抓取怎么做营销型网站开发定制
  • 福州营销型网站建设中国建设工程信息网站
  • 怎么在服务器里面做网站公司网站模板怎么做
  • 网站建设制作设计营销公司杭州石家庄网络公司哪家好
  • 重庆网站制作特点优势互联免费主机
  • 义乌网站制作多少钱wordpress有访客记录
  • 网站改版建议策划书百度搜索名字排名优化
  • 做药的常用网站wordpress加载js代码
  • 网站备案 通知杭州企业展厅设计公司
  • 简单个人网站开发代码广州白云区建设局网站
  • 网站空间控制面板软件做网站设计前景怎么样
  • 交流平台网站怎么做不了在家做网站编辑
  • 网站管理员登陆不了免费网页上传网站
  • 关于网站建设的英文歌外网设计素材网站
  • 中山比好的做网站的公司扫二维码直接进网站怎么做
  • 上海互联网网站建设东莞系统网站建设
  • 系部网站建设创新点外贸平台网站的营销方式
  • 做网站不给源代码吉林省招标网官方网站
  • 设计公司网站需要什么条件韩国能否出线
  • 做网站每个月可以赚多少钱公司注册网上怎么申请核名
  • 网站做防伪查询代码高校网站建设意义
  • 网站建设个人年终总结电子商务网站开发主要有哪些
  • 网站的二级页面在哪里做wordpress最好最全的教程
  • flash 网站视频温州市微网站制作电话
  • 网站 公司实力个人免费网站如何做
  • 网站 分析vultr部署wordpress
  • wordpress来建站网站开发人员工具种类
  • 福建省建设执业注册中心网站网络运维工程师求职信