图像点运算
灰度直方图:图像中每一个灰度值与其出现频率的统计关系直方图特征:
1.没有位置信息
2.与图像之间是一对多的映射关系。任意一副图像都有唯一确定的一个直方图,但是不同图像可能有相同的直方图
3.可叠加性: 各个子区域之和等于该图像全图的直方图
获取直方图的方式:
第一种: 使用HDevelop根据直接打开
第二种: 使用算子获取直方图的图案, 用区域类型保存, 最后在窗体上进行渲染
相关算子:
•从灰度直方图自动计算分割阈值:histo_to_thresh()
•灰度线性缩放(调整图像明暗):scale_image()
•图像灰度非线性变化:log_image()
•幂次变换(指数变换):pow_image()
•增强图像对比度:emphasize()
•图像相加(融合两幅图像):add_image()
•图像相减(提取两幅图像的差异):sub_image()
•图像相乘(增强灰度差异):mult_image()
•图像相除(归一化灰度分布):div_image()
•求图像的绝对差异处理:abs_diff_image ()
•从拆分的R/G/B通道转灰度图像:rgb3_to_gray()
•图形锐化:sobel_amp()
cs
*// 获取图像
read_image (Image, 'printer_chip/printer_chip_01')
*// 打开一个新窗体
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*// 显示文本
dev_disp_text ('Image灰度直方图绝对分布', 'window', 'top', 'left', 'black', [], [])
*// 获取整幅图像的灰度直方图
*// 参数1: 输入图像(用于定义灰度范围)
*// 参数2: 输入区域(这里用Image表示整幅图像区域)
*// 参数3: 输出绝对直方图数组(长度256,索引0~255对应灰度值,值为该灰度出现的像素数)
*// 参数4: 输出相对直方图数组(长度256,值为该灰度像素数占总像素数的比例)
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)
*// 将绝对的灰度直方图展示在窗体中
* 参数1: 输出显示区域
* 参数2: 输入直方图数组(这里用AbsoluteHisto)
* 参数3: 直方图X轴缩放因子
* 参数4: 直方图Y轴缩放因子
* 参数5: 直方图类型(1=条形图,2=轮廓线)
gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)
*// 从灰度直方图自动计算分割阈值
*// 参数1: 输入直方图数组
*// 参数2: Sigma:平滑因子(取值[0.5,30],默认2,值越大阈值越平滑)
*// 参数3: 输出最小阈值
*// 参数4: 输出最大阈值
histo_to_thresh (AbsoluteHisto, 2, MinThresh, MaxThresh)
*// 阈值分割
threshold (Image, Region1, MinThresh, MaxThresh)
*// 连通域分析
connection (Region1, ConnectedRegions)
dev_clear_window ()
*// 显示连通域
dev_display (ConnectedRegions)
*// 清空窗体
dev_clear_window ()
*// 直方图均衡化:调整图像中明暗程度,将密集的灰度值拉开一定距离,从而增强图像边缘对比度
*// 获取图片
read_image (Image1, 'D:/ChuanDingZN/全部学习记录/新/Halcon/day05/图片预处理素材/直方图/3.tif')
*// 直方图均衡化 把一些有蒙层的图像变的清晰
equ_histo_image (Image1, ImageEquHisto)
*// 清空窗体
dev_clear_window ()
*// 获取图像
read_image (Image2, 'printer_chip/printer_chip_01')
*// 灰度线性变化
*// 获取图像灰度值的范围
*// 参数1: 待检查的区域
*// 参数2: 表示输入的灰度值图像
*// 参数3: 百分比阈值(0表示不排除极值,5表示排除最小/最大5%的像素)
*// 参数4: 最小的灰度值
*// 参数5: 最大的灰度值
*// 参数6: 输出灰度范围(Max - Min)
min_max_gray (Image, Image2, 0, Min, Max, Range)//min10,max255,Range(最大值减最小值)245
*// 灰度线性缩放(调整图像明暗)
*// 调整图像中灰度值明暗程度:通过缩放灰度值的变化比例,通过修改图像中像素的灰度值改变它的明暗变化
*// 参数1: 输入图像
*// 参数2: 输出缩放后的图像
*// 参数3: 缩放因子(Mult>1变亮,<1变暗,=1无缩放)
*// 参数4: 加法因子(Add>0变亮,<0变暗,=0无偏移)
*// 计算公式:新灰度值 = 原灰度值 * Mult + Add
scale_image (Image2, ImageScaled,1, 100)
*// 灰度范围最大化(自动将灰度值扩展到0~255,增强对比度)
*// 参数1: 输入图像
*// 参数2: 输出归一化后的图像
scale_image_max (ImageScaled, ImageScaleMax)
*// 保存图像到本地
*// 参数1: 输入要保存的图像
*// 参数2: 保存格式('tiff'/'png'/'jpg'等)
*// 参数3: 压缩质量(0=无损,1~99=有损压缩)
*// 参数4: 保存路径(含文件名)
write_image (ImageScaleMax, 'tiff', 0,'D:/ChuanDingZN/全部学习记录/新/Halcon/day05/1')
*// 简单总结下:
*// 当我们在进行图像运算时,可以先获取图像的最大灰度值和最小灰度值对于有些图像较为模糊的,可以执行灰度直方图,直方图均衡化,缩放图像灰度值,
*// 对于处理完成后的图像,我们可以先进行保存到本地中对于一些有标记的图像,就是图像有显示的文本信息,
*// 一种是:保存在window(窗体上)使用算子:dump_window()
*// 一种是:保存在image(图像上)使用算子:write_image()
*// 清空窗体
dev_clear_window ()
*// 获取图像
read_image (Image3, 'printer_chip/printer_chip_01')
*// 图像灰度非线性变化
*// 对数变换:压缩低灰度级别,扩展高灰度级别
*// 参数1: 输入图像
*// 参数2: 输出对数变换后的图像
*// 参数3: 对数底数('e'/2/10等,底数>1时图像整体变亮)
*// 计算公式:新灰度值 = log(原灰度值 + 1) * 缩放系数(自动适配0~255)
log_image (Image3, LogImage, 'e') // 自然对数
log_image (Image3, LogImage, 2) // 2为底对数
log_image (Image3, LogImage, 10) // 10为底对数
*// 清空窗体
dev_clear_window ()
*// 获取图像
read_image (Image4, 'printer_chip/printer_chip_01')
*// 指数非线性变化: 选择增强的灰度值或者是高灰度值的对比度
*// 幂次变换(指数变换)
*// 参数1: 输入图像(这里用对数变换后的LogImage)
*// 参数2: 输出幂次变换后的图像
*// 参数3: 幂次因子(>1增强暗部对比度,<1增强亮部对比度)
*// 计算公式:新灰度值 = (原灰度值)^Power * 缩放系数(自动适配0~255)
pow_image (LogImage, PowImage, 2)
*// 清空窗体
dev_clear_window ()
*// 获取图像
read_image (Image5, 'printer_chip/printer_chip_01')
*// 图像灰度值取反(黑色变白色 白色变黑色)
invert_image (Image5, ImageInvert)
*// 增强图像对比度(基于低通滤波的边缘增强)
*// 参数1: 输入图像
*// 参数2: 输出增强后的图像
*// 参数3: 低通掩膜宽度(奇数,值越大增强越明显)
*// 参数4: 低通掩膜高度(奇数,值越大增强越明显)
*// 参数5: 对比度强度因子(>0,值越大对比度越强)
emphasize (ImageInvert, ImageEmphasize, 7, 7, 1)
*// 清空窗体
dev_clear_window ()
*// 获取图像
read_image (Image6, 'D:/ChuanDingZN/全部学习记录/新/Halcon/day05/图片预处理素材/直方图/2.tif')
read_image (Image7, 'D:/ChuanDingZN/全部学习记录/新/Halcon/day05/图片预处理素材/直方图/3.tif')
*// 图像的加减乘除: add_image/sub_image/mult_image/div_image
*// 清空窗体
dev_clear_window ()
*// 图像相加(融合两幅图像)
*// 参数4:Mult:相乘因子(0.5表示求两幅图像的平均值)
*// 参数5:Add:相加因子,0 没有额外的灰度值变化
*// 计算公式:新灰度值 = (Img1 + Img2) * Mult + Add
add_image (Image6, Image7, ImageResult, 0.5, 0)
*// 清空窗体
dev_clear_window ()
*// 图像相减(提取两幅图像的差异)
*// 参数4: 相乘因子(1表示无缩放)
*// 参数5: 相加因子(128用于避免负值,使差异更易观察)
*// 计算公式:新灰度值 = (Img1 - Img2) * Mult + Add
sub_image (Image6, Image7, ImageSub, 1, 128)
*// 清空窗体
dev_clear_window ()
*// 图像相乘(增强灰度差异)
*// 参数4: 相乘因子(0.005用于缩放结果,避免超出255)
*// 参数5: 相加因子(0无偏移)
*// 计算公式:新灰度值 = (Img1 * Img2) * Mult + Add
mult_image (Image6, Image7, ImageResult1, 0.005, 0)
*// 清空窗体
dev_clear_window ()
*// 图像相除(归一化灰度分布)
*// 参数4: 相乘因子(100用于放大结果,增强可视性)
*// 参数5: 相加因子(0无偏移)
*// 计算公式:新灰度值 = (Img1 / Img2) * Mult + Add (避免除零,分母为0时结果为0)
div_image (Image6, Image7, ImageResult2, 100, 0)
*// 求图像的绝对差异处理(提取两幅图像的像素级差异)
*// 参数4: 缩放因子(1表示无缩放)
*// 计算公式:新灰度值 = |Img1 - Img2| * Mult
abs_diff_image (Image6, Image7, ImageAbsDiff, 1)
*// 清空窗体
dev_clear_window ()
*// 获取图像
read_image (Image8, 'claudia')
*// 使用算子:把彩色图像转换成灰度图像
*// (基于RGB加权公式:gray=0.299*R+0.587*G+0.114*B)
*// 参数1: 输入彩色图像(三通道)
*// 参数2: 输出灰度图像(单通道)
rgb1_to_gray (Image8, GrayImage)
*// 统计图像通道数
*// 参数1: 输入图像
*// 参数2: 输出通道数(灰度图=1,彩色图=3)
count_channels (GrayImage, Channels) // Channels=1
count_channels (Image8, Channels2) // Channels2=3
*// 彩色图像拆分为单通道(R/G/B)
*// 参数1: 输入彩色图像(三通道)
*// 参数2: 输出R通道图像(单通道)
*// 参数3: 输出G通道图像(单通道)
*// 参数4: 输出B通道图像(单通道)
decompose3 (Image8, R, G, B)
*// 单通道图像合并为彩色图像
*// 参数1: 输入R通道图像
*// 参数2: 输入G通道图像
*// 参数3: 输入B通道图像
*// 参数4: 输出彩色图像(三通道)
compose3 (R, G, B, MultiChannelImage)
dev_clear_window ()
*// 从拆分的R/G/B通道转灰度图像
*// 参数1: 输入R通道图像
*// 参数2: 输入G通道图像
*// 参数3: 输入B通道图像
*// 参数4: 输出灰度图像
rgb3_to_gray (R, G, B, ImageGray)
*// 图形锐化(Sobel边缘幅值滤波)
*// 核心作用:通过计算X/Y方向梯度幅值突出图像边缘,实现图形锐化
*// 参数1: 输入 - 待锐化的灰度图像(必须为灰度图,彩色图需先转灰度)
*// 参数2: 输出 - 锐化后的图像(边缘幅值图,边缘区域亮、平滑区域暗)
*// 参数3: 输入 - 梯度幅值计算方式(决定边缘粗细/强度):
*// → 'sum_abs':X/Y梯度绝对值之和(最常用,边缘响应强)
*// → 'thin_sum_abs':精简版绝对值和(边缘更细,噪声更少)
*// → 'thin_max_abs':X/Y梯度绝对值最大值(边缘最细,仅保留最强梯度)
*// → 'sum_sqrt':梯度平方和的平方根(计算精准,速度稍慢)
*// → 'x':仅提取X方向梯度(突出垂直边缘)
*// → 'y':仅提取Y方向梯度(突出水平边缘)
*// 参数4: 输入 - 滤波掩模尺寸(必须为奇数,影响边缘亮度/噪声抑制):
*// → 3:边缘最亮、锐化最强,噪声多(低噪声图像首选)
*// → 5:平衡锐化与噪声抑制(新手默认首选)
*// → 7:边缘偏暗、噪声最少(高噪声图像首选)
sobel_amp (Image, ImageSharp, 'sum_abs', 5)
*获取直方图和直方图均衡化:
•获取灰度直方图的算子:gray_histo()
•获取图像灰度值的范围:min_max_gray()
•将灰度直方图的绝对分布 生成区域类型:gen_region_histo()
•直方图均衡化 把一些有蒙层的图像变的清晰:equ_histo_image()

cs
*// 获取图片//---------------------
read_image (Image, 'printer_chip/printer_chip_01')
*// 获取图片大小//---------------------
get_image_size (Image, Width, Height)
*// 展示图片//---------------------
dev_display (Image)
*// 获取灰度直方图的算子//---------------------
*// AbsoluteHisto 绝对直方图分布数据 总共元素个数0~255代表灰度值,元素值是代表灰度值的个数
*// RelativeHisto 相对直方图分布数据 总共元素个数0~255代表灰度值,元素值是代表灰度值所占的比例
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)
*// 获取灰度值为10的个数//---------------------
count := AbsoluteHisto[10]//47
*// 获取灰度值为10的所占总像素的比例//---------------------
count1 := RelativeHisto[10]//2.44792e-05
*// 获取图像灰度值的范围//---------------------
* 参数1: 待检查的区域
* 参数2: 表示输入的灰度值图像
* 参数3: 表示低于最大绝对灰度值的百分比,如果值是5 排除最小值的5%和最大值的5% 计算剩余的最大值和最小值
* 参数4: 最小的灰度值
* 参数5: 最大的灰度值
* 参数6: 最大值和最小值的区间
min_max_gray (Image,Image, 0, Min, Max, Range)//min10,max255,range(最大值减最小值)245
*// 将灰度直方图的绝对分布 生成区域类型//---------------------
gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)
*// 清空窗口//---------------------
dev_clear_window ()
*// 获取图片//---------------------
read_image (Image1, 'E:/桌面/图片集/图片预处理素材/直方图/2.tif')
*// 直方图均衡化 把一些有蒙层的图像变的清晰//---------------------
equ_histo_image (Image1, ImageEquHisto)
希望对大家有所帮助, 感谢大家的关注和点赞。