(数字图像处理MATLAB+Python)第十一章图像描述与分析-第三、四节:几何表述和形状描述
文章目录
- 一:几何描述
- (1)像素间几何关系
- A:邻接与连通
- B:距离
- (2)像素间几何特征
- A:位置
- B:方向
- C:尺寸
- (3)程序
- 二:形状描述
- (1)矩形度
- (2)圆形度
- A:圆度
- B:边界能量
- C:圆形性
- D:内切圆与外接圆半径比
- E:程序
- (3)中轴变换
- A:概念
- B:程序
一:几何描述
(1)像素间几何关系
A:邻接与连通
前景与背景:
- 前景: 指的是图像中的目标或感兴趣的物体,通常具有较高的像素值(亮度或颜色),并且在视觉上与其他部分区分开来。在像素级别,前景像素通常集中在一起,形成连续的区域,表示目标的外轮廓或内部信息
- 背景: 是指前景之外的图像区域,它通常包含着前景,并提供了前景的环境和上下文信息。背景像素通常具有较低的像素值(亮度或颜色),并且在视觉上与前景区域有所区别
在几何关系方面,前景和背景之间存在多种关系,如:
- 前景-背景分割:这是图像处理和计算机视觉中的一个重要任务,即将图像中的前景目标从背景中分割出来。通过分析像素的几何关系、像素值和纹理等特征,可以进行前景-背景分割,以识别和提取出感兴趣的目标区域
- 前景-背景交互:在图像中,前景和背景可能相互作用或相互影响。例如,在人物摄影中,主体通常是前景,背景则提供了合适的背景环境。通过调整前景和背景之间的关系,可以实现更好的视觉效果
- 前景-背景约束:在计算机视觉领域,前景和背景之间的几何关系可以用于约束分析和处理的结果。例如,在对象识别中,通过考虑前景和背景之间的边界、比例关系等几何特征,可以提高目标检测和分类的准确性
路径与连通:
- 路径: 指的是从一个像素到另一个像素的连续线条或曲线。在图像处理和计算机视觉中,路径常用于描述物体的边界、轮廓或者像素之间的连接关系。路径可以按照不同的形式进行表示,比如二值图像中的像素序列、连续边缘点、多边形等
- 轮廓路径:在目标分割和识别中,轮廓路径表示了目标的外形边界,通过连接目标边界上的像素点而形成。
- 骨架路径:骨架路径也称为中轴线,表示了目标的主要结构或形态特征,是由目标内部的像素点连接而成
- 连通: 指的是像素之间的直接邻接关系,即相邻像素之间通过共享边或角来连接。在像素级别,连通性可以根据四邻域或八邻域进行定义,四邻域表示上下左右四个相邻像素,八邻域表示上下左右以及对角线方向的八个相邻像素
- 4连通:在四邻域中,如果两个像素之间共享一条边,则它们被认为是4连通的。
- 8连通:在八邻域中,如果两个像素之间共享一条边或者一个角,则它们被认为是8连通的
B:距离
距离:对于像素 p p p、 q q q和 z z z,如果满足以下三个条件,则称 d d d是距离函数或度量
- d ( p , q ) ≥ 0 d(p,q)\geq 0 d(p,q)≥0
- d ( p , q ) = d ( q , p ) d(p,q)=d(q,p) d(p,q)=d(q,p)
- d ( p , z ) ≤ d ( p , q ) + d ( q , z ) d(p,z)\leq d(p,q)+d(q,z) d(p,z)≤d(p,q)+d(q,z)
其中,欧式距离是指
D e ( p , q ) = ( x − s ) 2 + ( y − t ) 2 D_{e}(p, q)=\sqrt{(x-s)^{2}+(y-t)^{2}} De(p,q)=(x−s)2+(y−t)2
城市距离: D 4 ( p , q ) = ∣ x − s ∣ + ∣ y − t ∣ D_{4}(p,q)=|x-s|+|y-t| D4(p,q)=∣x−s∣+∣y−t∣
棋盘距离: D 8 ( p , q ) = m a x ( ∣ x − s ∣ , ∣ y − t ∣ ) D_{8}(p,q)=max(|x-s|,|y-t|) D8(p,q)=max(∣x−s∣,∣y−t∣)
(2)像素间几何特征
A:位置
位置:物体在图像中的位置,用物体面积的中心点来表示。二值图像质量分布是均匀的,质心和形心重合。若图像中的物体对应的像素位置坐标为 ( x i , y i ) ( i = 0 , 1 , … , n - 1 ; j = 0 , 1 , … , m - 1 ) (x_{i},y_{i})(i=0, 1, …, n-1;j=0, 1, …, m-1) (xi,yi)(i=0,1,…,n-1;j=0,1,…,m-1),则质心位置坐标为
x ˉ = 1 m n ∑ i = 0 n − 1 ∑ j = 0 m − 1 x i ; y ˉ = 1 m n ∑ i = 0 n − 1 ∑ j = 0 m − 1 y j \bar{x}=\frac{1}{m n} \sum_{i=0}^{n-1} \sum_{j=0}^{m-1} x_{i} ; \bar{y}=\frac{1}{m n} \sum_{i=0}^{n-1} \sum_{j=0}^{m-1} y_{j} xˉ=mn1i=0∑n−1j=0∑m−1xi;yˉ=mn1i=0∑n−1j=0∑m−1yj
B:方向
方向:如果物体是细长的,则可以把较长方向的轴定为物体的方向。将最小二阶矩轴(最小惯量轴在二维平面上的等效轴)定义为较长物体的方向。也就是说,要找出一条直线,使下式定义的 E E E值最小
E = ∬ r 2 f ( x , y ) d x d y E=\iint r^{2} f(x, y) d x d y E=∬r2f(x,y)dxdy
C:尺寸
长宽:当物体的边界已知时,用其外接矩形的尺寸来刻画它的基本形状是最简单的方法求物体在坐标系方向上的外接矩形,只需计算物体边界点的最大和最小坐标值,就可得到物体的水平和垂直跨度
- 最小外接矩形:对任意朝向的物体,水平和垂直并非是我们感兴趣的方向。有必要确定物体的主轴,然后计算反映物体形状特征的主轴方向上的长度和与之垂直方向上的宽度,这样的外接矩形是物体的
周长:区域的边界长度,用于区别具有简单或复杂形状的物体;表示方法不同,计算方法也不同
- 边界用隙码表示:把图像中的像素看作单位面积小方块,则图像中的区域和背景均由小方块组成。区域的周长即为区域和背景缝隙的长度和,此时边界用隙码表示。因此,求周长就是计算隙码的长度
- 边界用链码表示:把像素看作一个个点时,周长用链码表示,求周长也即计算链码长度
- 边界用面积表示:即边界点数之和,每个点占面积为1的一个小方块
面积:度量物体的总尺寸,只与该物体的边界有关,与其内部灰度级的变化无关。像素计数面积是指
- 统计边界内部(也包括边界上)的像素数目
- 对二值图像而言,若用1表示物体,用0表示背景,其面积就是统计 f ( x , y ) = 1 f(x,y)=1 f(x,y)=1的个数
(3)程序
如下:对图像进行阈值分割,并统计区域的几何特征
matlab:
clear,clc,close all;
image=imread('plane.jpg');
BW=im2bw(rgb2gray(image));
figure,imshow(BW),title('二值化图像');
% imwrite(BW,'biplane.jpg');
SE=strel('square',3);
Morph=imopen(BW,SE);
Morph=imclose(Morph,SE);
figure,imshow(Morph),title('形态学滤波');
% imwrite(Morph,'morphplane.jpg');
[B,L]=bwboundaries(1-Morph);
figure,imshow(L),title('划分的区域');
% imwrite(L,'Lplane.jpg');
STATS = regionprops(L,'Area', 'Centroid','Orientation','BoundingBox');
figure,imshow(image),title('检测的区域');
hold on;
for i=1:length(B)boundary=B{i};plot(boundary(:,2),boundary(:,1),'r','LineWidth',2);
end
rectangle('Position',STATS.BoundingBox,'edgecolor','g');
hold off;
% STATS
python:
import numpy as np
import cv2
import matplotlib.pyplot as pltimage = cv2.imread('plane.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, bw = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
plt.imshow(bw, cmap='gray')
plt.title('二值化图像')
plt.show()kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
morph = cv2.morphologyEx(bw, cv2.MORPH_OPEN, kernel)
morph = cv2.morphologyEx(morph, cv2.MORPH_CLOSE, kernel)
plt.imshow(morph, cmap='gray')
plt.title('形态学滤波')
plt.show()contours, _ = cv2.findContours(255 - morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
boundary_image = np.zeros_like(morph)
cv2.drawContours(boundary_image, contours, -1, 255, 1)
plt.imshow(boundary_image, cmap='gray')
plt.title('划分的区域')
plt.show()stats = []
for contour in contours:area = cv2.contourArea(contour)centroid = np.mean(contour, axis=0)[0]rect = cv2.boundingRect(contour)stats.append({'Area': area,'Centroid': centroid,'BoundingBox': rect})image_with_boundary = image.copy()
for boundary in contours:cv2.drawContours(image_with_boundary, [boundary], -1, (0, 0, 255), 2)for stat in stats:cv2.rectangle(image_with_boundary, stat['BoundingBox'], (0, 255, 0), 2)plt.imshow(cv2.cvtColor(image_with_boundary, cv2.COLOR_BGR2RGB))
plt.title('检测的区域')
plt.show()
二:形状描述
(1)矩形度
矩形度:用于描述实体或区域与矩形接近程度的量化指标。它衡量了一个对象或区域在形状上与矩形的相似程度,即其紧凑性和规则性。矩形度是通过比较对象的实际面积和最小外接矩形(Bounding Rectangle)的面积来计算的。最小外接矩形是能够完全包围对象的最小面积的矩形,它的长宽与对象的主要方向一致。矩形度的计算公式如下
- A o A_{o} Ao:该物体的面积
- A M E R A_{MER} AMER:MER的面积
R = A o A M E R R=\frac{A_{o}}{A_{MER}} R=AMERAo
MER宽与长的比值为
r = W M E R L M E R r=\frac{W_{MER}}{L_{MER}} r=LMERWMER
(2)圆形度
A:圆度
圆度:用于描述实体或区域与圆形接近程度的量化指标。它衡量了一个对象或区域在形状上与圆形的相似程度,即其圆形度。圆度是通过比较对象的实际面积和等效圆形的面积来计算的。等效圆形是具有与对象相同面积的圆形,其半径可以通过将对象的面积除以π然后开方来计算。圆度的计算公式如下
- F = 1 F=1 F=1:区域为圆
- F < 1 F<1 F<1:区域为其他形状
- 区域边界弯曲越复杂,区域的性状越偏离圆,F会越小
F = 4 π A P 2 F=\frac{4\pi A}{P^{2}} F=P24πA
B:边界能量
边界能量:边界上的点的曲率函数
- P P P:物体的周长
- p p p:边界上点到某一起始点的距离
- r ( p ) r(p) r(p):边界上一点的瞬时曲率半径。是该点与边界相切圆的半径
- K ( p ) K(p) K(p) :是周期为P的周期函数
K ( p ) = 1 r ( p ) K(p)=\frac{1}{r(p)} K(p)=r(p)1
C:圆形性
圆形性:是用于描述实体或物体形状接近球体的度量标准。它衡量了一个对象或区域在形状上与球体的相似程度。圆形性是通过比较对象的体积和等效球体的体积来计算的。等效球体是具有与对象相同体积的球体,其半径可以通过将对象的体积除以(4/3π)然后开立方根来计算
C = μ R σ R 2 μ R = 1 K ∑ k = 0 K − 1 ∥ ( x k , y k ) − ( x ˉ , y ˉ ) ∥ σ R 2 = 1 K ∑ k = 0 K − 1 [ ∥ ( x k , y k ) − ( x ˉ , y ˉ ) ∥ − μ R ] 2 \begin{array}{l}C=\frac{\mu_{R}}{\sigma_{R}^{2}} \\\mu_{R}=\frac{1}{K} \sum_{k=0}^{K-1}\left\|\left(x_{k}, y_{k}\right)-(\bar{x}, \bar{y})\right\| \\\sigma_{R}^{2}=\frac{1}{K} \sum_{k=0}^{K-1}\left[\left\|\left(x_{k}, y_{k}\right)-(\bar{x}, \bar{y})\right\|-\mu_{R}\right]^{2}\end{array} C=σR2μRμR=K1∑k=0K−1∥(xk,yk)−(xˉ,yˉ)∥σR2=K1∑k=0K−1[∥(xk,yk)−(xˉ,yˉ)∥−μR]2
D:内切圆与外接圆半径比
内切圆与外接圆半径比:刻画物体边界的复杂程度
- r i r_{i} ri:区域内切圆半径
- r c r_{c} rc:区域外接圆半径
S = r i r c S=\frac{r_{i}}{r_{c}} S=rcri
两个圆的圆心都在区域的重心上
- 当区域为圆时, S S S最大1.0
- 其余形状时,则有 S S S<1.0
- S S S不受区域平移、旋转和尺度变化的影响
E:程序
如下,对原图进行分割,并检测圆和矩形
matlab:
clear,clc,close all;
image=rgb2gray(imread('shape.png'));
figure,imshow(image),title('Ôͼ');
BW=edge(image,'canny');
figure,imshow(BW),title('±ß½çͼÏñ');
% imwrite(BW,'shapeedge.jpg');
SE=strel('disk',5);
Morph=imclose(BW,SE);
figure,imshow(Morph),title('ÐÎ̬ѧÂ˲¨');
% imwrite(Morph,'shapemorph.jpg');
Morph=imfill(Morph,'holes');
figure,imshow(Morph),title('ÇøÓòÌî³ä');
imwrite(Morph,'shapefill.jpg');
[B,L]=bwboundaries(Morph);
figure,imshow(L),title('¼ì²âÔ²ºÍ¾ØÐÎ');
% imwrite(L,'Lplane.jpg');
STATS = regionprops(L,'Area', 'Centroid','BoundingBox');
len=length(STATS);
hold on
for i=1:lenR=STATS(i).Area/(STATS(i).BoundingBox(3)*STATS(i).BoundingBox(4));boundary=fliplr(B{i});everylen=length(boundary);F=4*pi*STATS(i).Area/(everylen^2);dis=pdist2(STATS(i).Centroid,boundary,'euclidean');miu=sum(dis)/everylen;sigma=sum((dis-miu).^2)/everylen;C=miu/sigma;if R>0.9 && F<1 rectangle('Position',STATS(i).BoundingBox,'edgecolor','g','linewidth',2);plot(STATS(i).Centroid(1),STATS(i).Centroid(2),'g*');endif R>pi/4-0.1 && R<pi/4+0.1 && F>0.9 && C>10rectangle('Position',[STATS(i).Centroid(1)-miu,STATS(i).Centroid(2)-miu,2*miu,2*miu],...'Curvature',[1,1],'edgecolor','r','linewidth',2); plot(STATS(i).Centroid(1),STATS(i).Centroid(2),'r*');end
end
hold off
python:
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像并将其转换为灰度图像
image = cv2.imread('shape.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 显示原始图片
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('原始图像')
plt.show()# 边缘检测
edges = cv2.Canny(gray, 30, 100)# 显示边缘图片
plt.imshow(edges, cmap='gray')
plt.title('边缘图像')
plt.show()# 闭运算
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
closed = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)# 显示闭运算结果
plt.imshow(closed, cmap='gray')
plt.title('闭运算')
plt.show()# 填充内部空洞
filled = cv2.fillHoles(closed)# 显示填充结果
plt.imshow(filled, cmap='gray')
plt.title('填充后图像')
plt.show()# 寻找轮廓并进行形状分析
contours, _ = cv2.findContours(filled, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:area = cv2.contourArea(cnt)x, y, w, h = cv2.boundingRect(cnt)rect_ratio = area / (w * h)perimeter = cv2.arcLength(cnt, True)circularity = 4 * np.pi * area / (perimeter ** 2)centroid = (int(x + w / 2), int(y + h / 2))distance = cv2.pointPolygonTest(cnt, centroid, True)if rect_ratio > 0.9 and circularity < 1:cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.circle(image, centroid, 3, (0, 255, 0), -1)if np.abs(circularity - np.pi / 4) < 0.1 and rect_ratio > 0.9 and distance > 10:cv2.rectangle(image, (int(centroid[0] - distance), int(centroid[1] - distance)),(int(centroid[0] + distance), int(centroid[1] + distance)), (0, 0, 255), 2)cv2.circle(image, centroid, 3, (0, 0, 255), -1)# 显示最终结果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('形状分析结果')
plt.show()
(3)中轴变换
A:概念
中轴变换:是一种图像处理技术,用于提取对象或区域的中轴线特征。中轴线是指与对象边界相切且具有最大内切圆的曲线。中轴变换的基本思想是通过迭代运算,在对象的边界上逐渐向内部收缩,直到达到中轴线所在位置。在这个过程中,计算每个边界点到最近内切圆的距离,并将这些距离值叠加在一起形成一个距离场。通过阈值处理和连接操作,可以得到中轴线。基本步骤如下
- 对图像进行预处理,例如灰度化、二值化等操作,使得对象与背景分离
- 找到对象的边界,可以使用边缘检测算法(如Canny边缘检测)来获得二值图像的边缘
- 初始化一个空图像作为距离场,距离场的大小与原始图像相同
- 从对象的边界点开始,对每个边界点进行以下操作
- 计算当前边界点到对象内部的最近内切圆的半径
- 将该半径值存储在距离场中对应的位置
- 根据距离场的阈值,将其二值化得到中轴图像
- 进行连接操作,对中轴图像进行处理,使得中轴线连续而不间断
中轴变换常用于形状分析、形态学处理、特征提取等领域。通过提取对象的中轴线,可以获得对象的结构信息和几何特征,有助于形状分析、目标识别、图像重建等应用。需要注意的是,中轴变换的结果受到图像预处理、阈值选择、连接方式等因素的影响。因此,在实际应用中,可能需要根据具体情况进行参数调整和优化,以获取更好的中轴线结果
B:程序
如下,提取目标图像骨架
matlab:
clear,clc,close all;
Image=imread('test.bmp');
BW=im2bw(Image);
figure,imshow(BW);
result=bwmorph(BW,'skel',Inf);
figure,imshow(result);
python:
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像并转换为二值图像
image = cv2.imread('test.bmp', 0)
ret, bw = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 显示原始二值图像
plt.imshow(bw, cmap='gray')
plt.title('原始二值图像')
plt.show()# 中轴变换
skeleton = np.zeros_like(bw)
size = np.size(bw)
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))while True:eroded = cv2.erode(bw, element)temp = cv2.dilate(eroded, element)temp = cv2.subtract(bw, temp)skeleton = cv2.bitwise_or(skeleton, temp)bw = eroded.copy()zeros = size - cv2.countNonZero(bw)if zeros == size:break# 显示中轴图像
plt.imshow(skeleton, cmap='gray')
plt.title('中轴图像')
plt.show()
相关文章:

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第三、四节:几何表述和形状描述
文章目录 一:几何描述(1)像素间几何关系A:邻接与连通B:距离 (2)像素间几何特征A:位置B:方向C:尺寸 (3)程序 二:形状描述&a…...

20230901工作心得:IDEA列操作lambda表达式加强版用法
今天是中小学开学时间,亦是9月的开始,继续努力。 今日收获较大的有四个地方,先说这四点。 1、IDEA列操作 使用场景:需要批量将Excel表格里的数据插入到数据库中,此时需要写大量的insert SQL语句。 比如像这样的&am…...

macOS Sonoma 14beta 7(23A5337a)更新发布,附黑/白苹果系统镜像
系统介绍(镜像请前往黑果魏叔官网下载) 黑果魏叔8 月 31 日消息,苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 7 更新(内部版本号:23A5337a),本次更新距离上次发布隔了 8 天。 …...

QT基础教程之九Qt文件系统
QT基础教程之九Qt文件系统 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图(Qt5)&#…...

OpenCV(十八):图像直方图
目录 1.直方图统计 2.直方图均衡化 3.直方图匹配 1.直方图统计 直方图统计是一种用于分析图像或数据的统计方法,它通过统计每个数值或像素值的频率分布来了解数据的分布情况。 在OpenCV中,可以使用函数cv::calcHist()来计算图像的直方图。 calcHist(…...
mac pro 查看隐藏文件夹
在Mac上查看隐藏文件夹可以使用以下方法: 使用终端: 打开终端应用程序,位于“应用程序”文件夹的“实用工具”子文件夹中。 在终端中,输入以下命令,然后按回车键: defaults write com.apple.finder AppleS…...

软件测试/测试开发丨Selenium 高级定位 Xpath
点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27036 一、xpath 基本概念 XPATH是一门在XML文档中查找信息的语言 XPATH使用路径表达式在XML文档中进行导航 XPATH的应用非常广泛,可以用于UI自…...

各类注意力机制Attention——可变形注意力
目录 《Attention is all you need 》稀疏Attention残差Attention通道注意力空间注意力时间注意力可变形注意力 《Attention is all you need 》 稀疏Attention 残差Attention 通道注意力 空间注意力 时间注意力 实际上序列类任务也属于时间注意力,比如transformer…...
桥接模式:连接抽象与实现
欢迎来到设计模式系列的第八篇文章!在之前的几篇文章中,我们已经学习了许多常见的设计模式,今天我们将继续探讨另一个重要的设计模式——桥接模式。 桥接模式简介 桥接模式是一种结构型设计模式,它主要用于将抽象部分与实现部分…...

同步推送?苹果计划本月推出 iOS17和iPadOS17,你的手机支持吗?
据报道,苹果公司计划在本月推出 iOS 17 和 iPadOS 17 正式版更新。与去年不同的是,这次更新将同时发布,而不是分别发布。根据彭博社的一位消息人士马克・古尔曼的说法,苹果公司认为 iOS 17 和 iPadOS 17 的第八个测试版已经非常接…...

方案展示 | RK3588开发板Linux双摄同显方案
iTOP-RK3588开发板使用手册更新,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。 RK3588开发板载4路MIPI CAMERA摄像头接口、MIPI CSI DPHY的4.5Gbps、2.5Gops的MIPI CSI CPHY,四路同时输入…...

数据库-多表设计
概述: 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本分为三种: 一对…...

一个简单的文件系统(MinixFS)实现解析
1. Minix文件系统概要 Minix file system 是 Andrew S. Tanenbaum 在 1980 年代发明的文件系统, 并随着 Minix 操作系统一起于 1987 年发布。 Linus 编写 Linux 内核第一个版本的时候, 使用的也是 Minix FS, Linux 至今依然提供了对 Minix FS 的支持。Minix FS 结构简单, 易于…...

地图投影-2亚当斯方形
说明 亚当斯方形 II 投影显示了一个方形的世界。它是 Oscar S. Adams 于 1925 年提出的两种投影之一。该投影为等角投影,但方形的四个角除外。在 Adams 最初的设计中,该投影将赤道和中央经线显示为方形的对角线。 此投影的一个有利属性是可以进行细分或…...
atcoder库中类欧(类欧几里得算法)floor_sum用法
https://atcoder.jp/contests/practice2/tasks/practice2_c 求 ∑ i 0 N − 1 f l o o r ( ( A i B ) / m ) \sum_{i 0}^{N - 1} floor((A \times i B) / m) ∑i0N−1floor((AiB)/m) 直接使用即可: ansfloor_sum(n, m, A, B); //注意顺序...
后端面试话术集锦第 十一 篇:mybatis面试话术
这是后端面试集锦第十一篇博文——mybatis面试话术❗❗❗ 1. 介绍下mybatis,说说它的优缺点是什么? Mybatis是一个半ORM(对象关系映射)的持久层框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程…...

SpringBoot运维实用篇、打包、运行、高级配置、多环境开发、日志
文章目录 SpringBoot运维实用篇YW-1.SpringBoot程序的打包与运行程序打包程序运行SpringBoot程序打包失败处理命令行启动常见问题及解决方案SpringBoot项目快速启动(Linux版) YW-2.配置高级YW-2-1.临时属性设置YW-2-2.配置文件分类YW-2-3.自定义配置文件…...

springdoc-openapi-ui 整合 knife,多模块分组,脚手架
pom文件: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…...

04-MySQL02
1、什么是索引下推? 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 需求: 查询users表中 "名字第一个字是张,年龄为10岁的所有记录"。 SELECT * FROM u…...

实现跨境电商测评和采退、LU卡、LU货最安全的系统方案
首先你要有一个稳定的测评环境系统,这个是做自养号退款、撸货、撸卡的基础。测评环境系统有很多,从早期的虚拟机,模拟机,云手机,VPS等等。这些系统方案先不说成本高,最重要的是成功率很低,所以一…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...