Python-OpenCV中的图像处理-图像直方图

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]])
    1. images: 原图像(图像格式为 uint8 或 float32)。当传入函数时应该
      用中括号 [] 括起来,例如: [img]。
    2. channels: 同样需要用中括号括起来,它会告诉函数我们要统计那幅图
      像的直方图。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像
      的话,传入的参数可以是 [0], [1], [2] 它们分别对应着通道 B, G, R。
    3. mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如
      果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并
      使用它。(后边有例子)
    4. histSize:BIN 的数目。也应该用中括号括起来,例如: [256]。
    5. 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 时 别 忘 了 设 置 minlength=256。
hist=np.bincount(img.ravel(), minlength=256)

绘制直方图

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, color='b')
plt.hist(img.flatten(), 256, [0, 256], color='r')
plt.xlim([0, 256])
plt.legend(('cdf', 'histogram'), loc='upper left')# 4.绘制均衡化直方图
plt.subplot(223), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_GRAY2RGB))
plt.subplot(224)
plt.plot(cdf_m, color='g')
plt.hist(img2.flatten(), 256, [0, 256], color='r')
plt.xlim([0, 256])
plt.legend(('cdf', 'histogram'), loc='upper 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(clipLimit=2.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.rhkb.cn/news/91037.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Medical Isolated Power Supply System in Angola

安科瑞 华楠 Abstract: Diagnosis and treatment in modern hospitals are inseparable from advanced medical equipment, which are inseparable from safe and reliable power supply. Many operations often last for several hours, and the consequences of a sudden pow…

欢迎光临,博客网站

欢迎光临:YUNYE博客~https://yunyeblog.com/更多的文章,供大家参考学习!!!

Mybatis 源码 ④ :TypeHandler

文章目录 一、前言二、DefaultParameterHandler1. DefaultParameterHandler#setParameters1.1 UnknownTypeHandler1.2 自定义 TypeHandler 三、DefaultResultSetHandler1. hasNestedResultMaps2. handleRowValuesForNestedResultMap2.1 resolveDiscriminatedResultMap2.2 creat…

VSCode使用SSH无密码连接Ubuntu

VSCode使用SSH无密码连接Ubuntu 前提条件: 1. 能够正常使用vscode的Remote-ssh连接Ubuntu 2. Ubuntu配置静态ip(否则经常需要修改Remote-ssh的配置文件里的IP) 链接-> ubuntun 18.04设为静态ip(.net模式,可连接…

初学HTML:在线简易画板设计。

最近在HTML&#xff0c;记录下一点点成果。 设计了一个简易画板&#xff0c;通过HTML的Canvas元素实现一个在线画板&#xff0c;用户可以在上面绘制图形或涂鸦。 下面是运行效果&#xff1a; 下面是代码&#xff1a; <!DOCTYPE html> <html> <head><ti…

蓝绿灰度发布的介绍

背景介绍 蓝绿灰度发布 介绍 蓝绿部署中&#xff0c;一共有两套系统&#xff1a;一套是正在提供服务系统(也就是上面说的旧版)&#xff0c;标记为绿色&#xff1b;另一套是准备发布的系统&#xff0c;标记为蓝色。两套系统都是功能完善的&#xff0c;并且正在运行的系统&…

安全 1自测

常见对称加密算法&#xff1a; DES&#xff08;Data Encryption Standard&#xff09;&#xff1a;数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合&#xff1b; 3DES&#xff08;Triple DES&#xff09;&#xff1a;是基于DES&#xff0c;对一块数据用…

C语言刷题训练【第11天】

大家好&#xff0c;我是纪宁。 今天是C语言笔试刷题训练的第11天&#xff0c;加油&#xff01; 文章目录 1、声明以下变量&#xff0c;则表达式: ch/i (f*d – i) 的结果类型为&#xff08; &#xff09;2、关于代码的说法正确的是&#xff08; &#xff09;3、已知有如下各变…

linux——MongoDB服务

目录 一、MongoDB概述 相关概念 特性 应用场景 二、目录结构 三、默认数据库 admin local config 四、数据库操作 库操作 文档操作 五、MongoDB数据库备份 一、备份 mongodump mongoexport 二、恢复 mongorestore mongoimport ​编辑 一、MongoDB概述 MongoDB是…

Live Market是如何做跨境客户服务的?哪些技术赋能?

在面对不同的海外市场和用户群体时,如何进行有效地出海营销是跨境商家面临的挑战。其中消费者服务管理和卖家保障尤其关键&#xff0c;如何做好客户服务管理?包括处理好客户投诉,提升消费者满意度是所有跨境商家和品牌独立站卖家非常重视的问题。 在数字化浪潮席卷之下&#…

VictoriaMetrics部署及vmalert集成钉钉告警

1、部署VictoriaMetrics cd /usr/local wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.65.0/victoria-metrics-amd64-v1.65.0.tar.gz mkdir victoria-metrics && tar -xvzf victoria-metrics-amd64-v1.65.0.tar.gz && \ mv …

【视频笔记】解密RWKV线性注意力的进化过程

from&#xff1a; https://www.bilibili.com/video/BV1zW4y1D7Qg/?spm_id_from333.999.0.0&vd_source21cce77bb69d40a81e0d37999f2da0c2 文章目录 向量版 Self-attentionAFT 的线性AttentionRWKV的线性Attention 向量版 Self-attention 手动实现&#xff0c;可以看出 时间…

jpg图片太大怎么压缩?这样做轻松压缩图片

图片太大会给存储、分享带来麻烦&#xff0c;但其实现在压缩图片大小也不是什么难事&#xff0c;下面就给大家分享几个一直用的图片压缩方法&#xff0c;包含批量压缩、在线压缩、免费压缩等多种方式&#xff0c;大家按需自取哈~ 方法一&#xff1a;嗨格式压缩大师 这是一个可…

深入理解 go协程 调度机制

Thread VS Groutine 这里主要介绍一下Go的并发协程相比于传统的线程 的不同点&#xff1a; 创建时默认的stack大小 JDK5 以后Java thread stack默认大小为1MC 的thread stack 默认大小为8MGrountine 的 Stack初始化大小为2K 所以Grountine 大批量创建的时候速度会更快 和 …

phpstorm添加vue 标签属性绑定提示和提示vue的方法提示

v-text v-html v-once v-if v-show v-else v-for v-on v-bind v-model v-ref v-el v-pre v-cloak v-on:click v-on:keyup.enter v-on:keyup click change input number debounce transition :is :class把上面这些文字粘贴到点击右下角放大按钮 后的文本框里&#xff0c;然后保存…

【BASH】回顾与知识点梳理(二十二)

【BASH】回顾与知识点梳理 二十二 二十二. Linux 账号管理22.1 Linux 的账号与群组使用者标识符&#xff1a; UID 与 GID使用者账号/etc/passwd 文件结构/etc/shadow 文件结构 关于群组&#xff1a; 有效与初始群组、groups, newgrp/etc/group 文件结构有效群组(effective grou…

岛屿的最大面积(力扣)递归 JAVA

给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&#xff09;包围着。 岛屿的面积是岛上值为 1 的…

前端:Vue.js学习

前端:Vue.js学习 1. 第一个Vue程序2. Vue指令2.1 v-if、v-else-if、v-else2.2 v-for2.3 事件绑定 v-on:2.4 v-model 数据双向绑定2.5 v-bind 绑定属性 3. Vue组件4. Vue axios异步通信5. 计算属性6. 插槽 slots7. 自定义事件内容分发 1. 第一个Vue程序 首先把vue.js拷贝到本地…

学习笔记|printf函数的实现|不同操作系统中的换行|数的进制:2进制、10进制、16进制转换|STC32G单片机视频开发教程(冲哥)|第五集:C语言基础

文章目录 1.C语言 printf函数的实现Tips&#xff1a;ASCII码表Tips&#xff1a;找不到头文件怎么办&#xff1f;主函数添加程序:常规用法:Tips&#xff1a;不同操作系统中的换行 ⒉数的进制:2进制、10进制、16进制.常见的对应&#xff1a;应用&#xff1a;整体端口的操作 3.C语…

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…