halcon项目实战 灰度投影

一、基本原理

直接上图 灰度投影 顾名思义 也就是一部分区域的投影 如果是水平投影 那就是水平行方向所有灰度值相加再求均值,知道所有行都计算完毕,相同列也是一样。基本理论很简单 如果涉及到所选区域不是对其行列而旋转一定角度。则可以使用插值算法依次计算各个区域的灰度值,再进行该角度方向上的投影

gray,例程,投影,Halcon,灰度,projections 

二、gray_projections算子

halcon特征提取(三)基于统计方式:gray_projections-分类器、神经网络、深度学习-少有人走的路

计算水平和垂直灰度值投影

​
gray_projections(Region, Image : : Mode : HorProjection, VertProjection)
​
** 功能:计算图片在rectangle1区域内的灰度投影
** Region:待处理区域
** image  待投影的灰度图
** Mode = 'simple',则在图像坐标轴的方向上执行投影
** 输出
** horizontalProjection  水平方向的灰度投影,就是说从
** verticalProjection   竖直方向投影


*如果选择了 Mode = 'simple',则在图像坐标轴的方向上执行投影,即:

注意:这里的水平和垂直方向的投影

 同理  垂直:

数学原理:

如果选择了 Mode = 'rectangle',则在输入区域任意方向的最小封闭矩形的主轴方向上执行投影

三、案例


read_image (Image721, 'C:/Users/alber/Desktop/test/721.png')
rgb1_to_gray (Image721, Image721)
get_image_size (Image721, Width2, Height2)

gen_rectangle1 (ROI_0, 103, 11, 202, 360)  // Width=360-11=350   Height=202-103=100
gen_rectangle1 (ROI_1, 23, 11, 222, 360)   // Width1=360-11=350   Height1=202-23=200

reduce_domain (Image721, ROI_0, ImageReduced)
crop_domain (ImageReduced, ImagePart1)

reduce_domain (Image721, ROI_1, ImageReduced3)
crop_domain (ImageReduced3, ImagePart3)

get_image_size (ImagePart1, Width, Height) //350  100
get_image_size (ImagePart3, Width1, Height1) //350 200
* 做映射
* 得出的结果是 HorProjection 是100 个值  对应的就是高 
* VertProjection 是350个值  对应的就是宽 
* 'simple' 坐标轴
gray_projections (ImageReduced, ImageReduced, 'simple', HorProjection, VertProjection)

* 转化为一维离散函数
create_funct_1d_array (HorProjection, Function)

* 做平滑  去噪处理
* 1 是平滑系数
* 1 是迭代测试
smooth_funct_1d_mean (Function, 1, 1, SmoothedFunction)

* 计算函数的一阶导函数和二阶导函数  'first' 一阶导数  second是二阶函数
derivate_funct_1d (SmoothedFunction, 'first', Derivative)

* 计算一维函数的最大和最小所在的位置
local_min_max_funct_1d (Derivative, 'plateaus_center', 'false', Min, Max)
* 获取一维离散函数的x和y值
funct_1d_to_pairs (Derivative, XValues, YValues)

gen_contour_polygon_xld (Contour1, XValues, YValues)




create_funct_1d_array (VertProjection, Function2)
smooth_funct_1d_mean (Function2, 1, 1, SmoothedFunction2)
derivate_funct_1d (SmoothedFunction2, 'first', Derivative2)
local_min_max_funct_1d (Derivative2, 'plateaus_center', 'false', Min_2, Max_2)
funct_1d_to_pairs (Derivative2, XValues_2, YValues_2)
gen_contour_polygon_xld (Contour2, YValues_2,XValues_2)

其中计算一阶导数 和二阶导数 

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'white', WindowHandle)
dev_set_color ('black')
dev_set_line_width (2)
 
X := []
for J := -127 to 128 by 1
    X := [X,J / 20.0]
endfor
tuple_length(X,len)
stop()

* 创建一个(x,y)的函数
create_funct_1d_pairs (X, cos(X), Cos)
 
plot_funct_1d (WindowHandle, Cos, 'x', 'cos(x)', 'red', ['axes_color','origin_x','origin_y'], ['black',0,0])
disp_continue_message (WindowHandle, 'black', 'true')


* 求一介倒数
derivate_funct_1d(Cos,'first', Derivative)
plot_funct_1d (WindowHandle, Derivative, 'x', 'cos(x)', 'blue', ['axes_color','origin_x','origin_y'], ['black',0,0])

derivate_funct_1d(Cos,'second', function_out)
plot_funct_1d (WindowHandle, function_out, 'x', 'cos(x)', 'green', ['axes_color','origin_x','origin_y'], ['black',0,0])

 

案例 

有一个二维码,要识别,但是那个位置飘忽不定,用blob 分析 干扰因素很多 等不稳定,所以用这个方法。可以测试一下

思路就是 在水平和竖直方向分别做投影,计算出起始点和终止点,计算其中心,组合起来,然后进行粗定位

read_image (Image999, 'C:/Users/alber/Desktop/opencv_images/999.png')
rgb1_to_gray (Image999, GrayImage)
get_image_size (GrayImage, Width, Height)
gray_closing_rect (GrayImage, ImageClosing, 15, 15)
* 先灰度投影,然后再计算一阶导数
gray_projections (ImageClosing, ImageClosing, 'simple', HorProjection, VertProjection)
create_funct_1d_array (VertProjection, Function_V)
smooth_funct_1d_mean (Function_V, 1, 1, SmoothedFunction_V)
derivate_funct_1d (SmoothedFunction_V, 'first', Derivative_V)
local_min_max_funct_1d (Derivative_V, 'plateaus_center', 'false', Min, Max)
funct_1d_to_pairs (Derivative_V, XValues, YValues)
derivate_funct_1d (Derivative_V, 'second', Derivative_2s_V)
gen_contour_polygon_xld (Contour1, YValues,XValues)
*拿到最大和最小的队友的坐标位置
startrow:=Max[0]
startowcol:=Height
gen_cross_contour_xld (Cross, startowcol, startrow, 60, 0.785398)
tuple_length (Min, Length)
endrow:=Min[Length-1]
endowcol:=Height
gen_cross_contour_xld (Cross1, endowcol, endrow, 60, 0.785398)

* 计算重点
midcol:=(endrow+startrow)/2
gen_cross_contour_xld (Cross2, endowcol,midcol , 6, 0.785398)

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要使用HALCON修改图像的灰度,可以使用以下步骤: 1. 使用函数rgb1_to_gray将彩色图像转换为灰度图像\[1\]。 2. 使用函数get_domain获取灰度图像的域\[1\]。 3. 使用函数get_region_points获取域中每个坐标的灰度值\[1\]。 4. 使用函数get_grayval获取图像中指定坐标的灰度值\[1\]。 5. 使用函数Graycal将灰度值进行计算和赋值\[1\]。 6. 使用函数set_grayval将计算后的灰度值赋值给图像的指定坐标\[1\]。 7. 使用函数write_image将修改后的图像保存为指定格式的文件\[1\]。 此外,如果图像中存在非常亮或非常暗的像素值,可以使用函数scale_image_range进行归一化处理\[2\]。该函数可以根据当前图像情况自动确定参数,使得变换后的图像灰度值覆盖最大取值范围。 总结起来,要修改图像的灰度,可以使用HALCON提供的函数来进行转换、获取、计算和赋值操作,并可以使用归一化方法来改善处理效果\[1\]\[2\]\[3\]。 #### 引用[.reference_title] - *1* [halcon修改图像的灰度值02](https://blog.csdn.net/qq_43069920/article/details/120660782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [HALCON灰度值变换](https://blog.csdn.net/m0_47015717/article/details/110292859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值