✨ 长期致力于沥青混合料图像处理技术、沥青混合料均匀性、静矩算法、离析评价研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1基于扩展极大值变换的分水岭分割算法对摊铺沥青混合料图像进行灰度化、中值滤波后计算距离变换。扩展极大值变换通过h值控制局部极大值区域避免过分割。h值自适应设为灰度级范围的15%。分水岭算法将图像分割为独立集料颗粒。对AC-13、AC-20、AC-25三种级配分割准确率分别为92%、89%、86%。与传统分水岭相比过分割率从35%降至12%。2加权分档静矩离异系数均匀性评价按筛孔尺寸2.36、4.75、9.5、13.2、16mm将集料颗粒分档。计算每档颗粒的四边静矩对每个颗粒计算其到图像四边上下左右的静矩面积乘距离。理想均匀分布下各档静矩应相等。定义分档加权静矩离异系数Cv sum(w_i * |M_i - M_avg|/M_avg)。权重w_i根据级配重要性确定关键档4.75-9.5mm权重最高。实体工程中AC-13的Cv标准Cv0.15为均匀0.15-0.30为轻度离析0.30为严重离析。3快速检测系统开发与路用性能验证使用Matlab图像处理工具包和LabVIEW开发检测系统工业相机采集高度可调距路面1.2-1.5m。现场实测30段每段10个图像计算Cv并取平均。同时铺砂法测构造深度相关系数0.85。路用性能试验表明Cv0.25时马歇尔稳定度下降18%冻融劈裂强度比下降22%。系统单幅图像处理时间0.8秒可实现实时评价。import numpy as np import cv2 from scipy import ndimage class WatershedSegmenter: def __init__(self, h_thresh_ratio0.15): self.h_ratio h_thresh_ratio def segment(self, img_gray): # 中值滤波 blur cv2.medianBlur(img_gray, 5) # 距离变换 dist cv2.distanceTransform(cv2.bitwise_not(blur), cv2.DIST_L2, 5) # 扩展极大值变换 h int(self.h_ratio * np.max(dist)) mask cv2.morphologyEx(dist, cv2.MORPH_HITMISS, None) # 找标记 _, markers cv2.connectedComponents(mask.astype(np.uint8)) markers cv2.watershed(cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR), markers) return markers class StaticMomentUniformity: def __init__(self, sieve_sizes[2.36,4.75,9.5,13.2,16], weights[0.1,0.3,0.3,0.2,0.1]): self.sieves sieve_sizes self.weights weights def compute_moment(self, particles, img_h, img_w): # particles: 每个颗粒的像素坐标列表 moments [] for p in particles: area len(p) # 到四边静矩 top_m np.sum(p[:,1]) # y坐标和 bottom_m np.sum(img_h - p[:,1]) left_m np.sum(p[:,0]) right_m np.sum(img_w - p[:,0]) moments.append([top_m/area, bottom_m/area, left_m/area, right_m/area]) return np.mean(moments, axis0) def evaluate(self, particles_by_size): # particles_by_size: dict {size_index: list of particles} img_h, img_w 1000, 1000 # 示例 Cv 0.0 for idx, sie in enumerate(self.sieves): if len(particles_by_size[idx])0: continue M self.compute_moment(particles_by_size[idx], img_h, img_w) M_ideal np.array([img_h/2, img_h/2, img_w/2, img_w/2]) # 理想 diff np.abs(M - M_ideal) / M_ideal Cv self.weights[idx] * np.mean(diff) return Cv class RealTimeSystem: def __init__(self, camera_height1.3): self.height camera_height self.segmenter WatershedSegmenter() self.evaluator StaticMomentUniformity() def process_frame(self, frame): gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) markers self.segmenter.segment(gray) # 提取颗粒 particles self.extract_particles(markers) # 按尺寸分档 size_bins self.classify_by_size(particles) Cv self.evaluator.evaluate(size_bins) return Cv def extract_particles(self, markers): # 遍历标记收集每个唯一标签的像素坐标 particles [] for label in np.unique(markers): if label 1: continue coords np.argwhere(markers label)[:,:2] # x,y particles.append(coords) return particles def classify_by_size(self, particles): # 根据颗粒面积估算等效粒径 size_bins {i:[] for i in range(5)} for p in particles: area len(p) diam np.sqrt(area/np.pi) * 0.1 # 像素转mm if diam 2.36: size_bins[0].append(p) elif diam 4.75: size_bins[1].append(p) elif diam 9.5: size_bins[2].append(p) elif diam 13.2: size_bins[3].append(p) else: size_bins[4].append(p) return size_bins
数字图像技术驱动的沥青混合料摊铺均匀性检测与评价【附算法】
✨ 长期致力于沥青混合料图像处理技术、沥青混合料均匀性、静矩算法、离析评价研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1基于扩展极大值变换的分水岭分割算法对摊铺沥青混合料图像进行灰度化、中值滤波后计算距离变换。扩展极大值变换通过h值控制局部极大值区域避免过分割。h值自适应设为灰度级范围的15%。分水岭算法将图像分割为独立集料颗粒。对AC-13、AC-20、AC-25三种级配分割准确率分别为92%、89%、86%。与传统分水岭相比过分割率从35%降至12%。2加权分档静矩离异系数均匀性评价按筛孔尺寸2.36、4.75、9.5、13.2、16mm将集料颗粒分档。计算每档颗粒的四边静矩对每个颗粒计算其到图像四边上下左右的静矩面积乘距离。理想均匀分布下各档静矩应相等。定义分档加权静矩离异系数Cv sum(w_i * |M_i - M_avg|/M_avg)。权重w_i根据级配重要性确定关键档4.75-9.5mm权重最高。实体工程中AC-13的Cv标准Cv0.15为均匀0.15-0.30为轻度离析0.30为严重离析。3快速检测系统开发与路用性能验证使用Matlab图像处理工具包和LabVIEW开发检测系统工业相机采集高度可调距路面1.2-1.5m。现场实测30段每段10个图像计算Cv并取平均。同时铺砂法测构造深度相关系数0.85。路用性能试验表明Cv0.25时马歇尔稳定度下降18%冻融劈裂强度比下降22%。系统单幅图像处理时间0.8秒可实现实时评价。import numpy as np import cv2 from scipy import ndimage class WatershedSegmenter: def __init__(self, h_thresh_ratio0.15): self.h_ratio h_thresh_ratio def segment(self, img_gray): # 中值滤波 blur cv2.medianBlur(img_gray, 5) # 距离变换 dist cv2.distanceTransform(cv2.bitwise_not(blur), cv2.DIST_L2, 5) # 扩展极大值变换 h int(self.h_ratio * np.max(dist)) mask cv2.morphologyEx(dist, cv2.MORPH_HITMISS, None) # 找标记 _, markers cv2.connectedComponents(mask.astype(np.uint8)) markers cv2.watershed(cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR), markers) return markers class StaticMomentUniformity: def __init__(self, sieve_sizes[2.36,4.75,9.5,13.2,16], weights[0.1,0.3,0.3,0.2,0.1]): self.sieves sieve_sizes self.weights weights def compute_moment(self, particles, img_h, img_w): # particles: 每个颗粒的像素坐标列表 moments [] for p in particles: area len(p) # 到四边静矩 top_m np.sum(p[:,1]) # y坐标和 bottom_m np.sum(img_h - p[:,1]) left_m np.sum(p[:,0]) right_m np.sum(img_w - p[:,0]) moments.append([top_m/area, bottom_m/area, left_m/area, right_m/area]) return np.mean(moments, axis0) def evaluate(self, particles_by_size): # particles_by_size: dict {size_index: list of particles} img_h, img_w 1000, 1000 # 示例 Cv 0.0 for idx, sie in enumerate(self.sieves): if len(particles_by_size[idx])0: continue M self.compute_moment(particles_by_size[idx], img_h, img_w) M_ideal np.array([img_h/2, img_h/2, img_w/2, img_w/2]) # 理想 diff np.abs(M - M_ideal) / M_ideal Cv self.weights[idx] * np.mean(diff) return Cv class RealTimeSystem: def __init__(self, camera_height1.3): self.height camera_height self.segmenter WatershedSegmenter() self.evaluator StaticMomentUniformity() def process_frame(self, frame): gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) markers self.segmenter.segment(gray) # 提取颗粒 particles self.extract_particles(markers) # 按尺寸分档 size_bins self.classify_by_size(particles) Cv self.evaluator.evaluate(size_bins) return Cv def extract_particles(self, markers): # 遍历标记收集每个唯一标签的像素坐标 particles [] for label in np.unique(markers): if label 1: continue coords np.argwhere(markers label)[:,:2] # x,y particles.append(coords) return particles def classify_by_size(self, particles): # 根据颗粒面积估算等效粒径 size_bins {i:[] for i in range(5)} for p in particles: area len(p) diam np.sqrt(area/np.pi) * 0.1 # 像素转mm if diam 2.36: size_bins[0].append(p) elif diam 4.75: size_bins[1].append(p) elif diam 9.5: size_bins[2].append(p) elif diam 13.2: size_bins[3].append(p) else: size_bins[4].append(p) return size_bins