Opencv python自定义函数,要求和halcon中算子一样简单调用
不太理解你为什么要跟halcon算子一样做调用选择。opencv自定义的函数和操作本来就挺容易,这是给你的一个例子:
import cv2
def my_custom_function(image):
processed_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
return processed_image
input_image = cv2.imread('input.jpg')
output_image = my_custom_function(input_image)
cv2.imshow('Input Image', input_image)
cv2.imshow('Output Image', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在OpenCV中,你可以通过定义Python函数来创建自定义的图像处理函数。这些函数可以使用OpenCV提供的各种图像处理函数,也可以包含你自己的算法和逻辑。
以下是一个简单的例子,这个函数将输入的图像转换为灰度图像:
import cv2
def convert_to_gray(image):
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
你可以像调用任何其他Python函数一样调用这个函数:
image = cv2.imread('image.jpg')
gray_image = convert_to_gray(image)
如果你想创建更复杂的函数,你可以在你的函数中使用更多的OpenCV函数,也可以添加更多的参数来控制你的函数的行为。例如,以下的函数将输入的图像转换为灰度图像,然后使用Canny算子进行边缘检测:
def detect_edges(image, low_threshold, high_threshold):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray_image, low_threshold, high_threshold)
return edges
你可以像这样调用这个函数:
image = cv2.imread('image.jpg')
edges = detect_edges(image, 100, 200)
这样,你就可以创建自己的OpenCV函数,使你的代码更加清晰和易于维护。
1.medianBlur()函数:使用中值滤波器来平滑图像。
dst = cv2.medianBlur(src, ksize[, dst])-----该函数使用具有ksize*ksize孔径大小的中值滤波器来平滑图像。对多通道图像的各通道独立处理。支持in-place操作。
在边界类型( BorderTypes)方面,使用的是 BORDER_REPLICATE 。
2.python关于图片二值化在图片中已有详细注释,补充内容可参考此文章:https://blog.csdn.net/sinat_21258931/article/details/61418681
3.开运算闭运算可参考此文章:https://blog.csdn.net/caojinpei123/article/details/81916005
4.腐蚀:会把物体的边界腐蚀掉,卷积核沿着图象滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。
膨胀:卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。一般在除噪是,先腐蚀再膨胀,因为腐蚀在去除白噪声的时候也会使图像缩小,所以我们之后要进行膨胀。当然也可以用来将两者物体分开。
"""
腐蚀
cv2.erode(src, # 输入图像
kernel, # 卷积核
dst=None,
anchor=None,
iterations=None, # 迭代次数,默认1
borderType=None,
borderValue=None)
膨胀
cv2.dilate(src, #输入图像
kernel, dst = None, anchor = None,
iterations = None #迭代次数,默认1
borderType = None,
borderValue = None)
"""
5.cv2.Canny()函数,
函数原型是这样的:edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
image参数表示8位输入图像。
threshold1参数表示设置的低阈值minVal。
threshold2参数表示设置的高阈值maxVal,一般设定为低阈值的3倍 (根据Canny算法的推荐)。
edges参数表示输出边缘图像,单通道8位图像。
apertureSize参数表示Sobel算子(卷积核)的大小。
L2gradient参数表示一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。
6.霍夫变换检测圆原理
7.霍夫变换检测圆函数:
cv.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
image:为输入图像,要求是灰度图像
method:为使用霍夫变换圆检测的算法
dp:用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,此参数允许创建一个比输入图像分辨率低的累加器。例如,如果dp = 1时,累加器和输入图像具有相同的分辨率。如果dp = 2,累加器便有输入图像一半那么大的宽度和高度,为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半。一般默认为1
minDist:为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心,(太大的话,会很多圆被认为是一个圆)
circles- 找到的圆的输出向量。每个向量被编码为3元素的浮点向量 (x,y,半径).(可省略)
param1:阈值。第一个方法特定的参数。在CV_HOUGH_GRADIENT的情况下, 两个传递给Canny()边缘检测器的阈值较高(较小的两个小于两倍)。一般默认为100
param2:阈值。第二种方法参数。在CV_HOUGH_GRADIENT的情况下 ,它是检测阶段的圆心的累加器阈值。越小,可能会检测到越多的虚假圈子。首先返回对应于较大累加器值的圈子。(圆越小设置越小,检测的圆越多,但检测大圆会有噪点)
minRadius:所检测到的圆半径的最小值
maxRadius:所检测到的圆半径的最大值
8.画出圆和圆心,并写入文件(详见注释)
9.Python文件操作说明
问题解答:
要在OpenCV中添加自定义函数并实现简单调用,需要遵循以下步骤: 1. 定义自己的自定义函数,例如:
double myFunction(double a, double b) {
return a + b;
}
double myFunction(double a, double b);
double result = myFunction(1.0, 2.0);
cout << "The result is: " << result << endl;
需要注意的是,自定义函数必须与OpenCV的数据类型和函数兼容,否则会出现编译错误。确保函数声明和调用都是在正确的位置和上下文中进行,以避免命名冲突或作用域错误。
以下是一个完整的示例程序,该程序定义了自定义函数myFunction
,并在main
函数中调用该函数来计算两个数字的和:
#include <iostream>
#include <opencv2/core.hpp>
using namespace std;
using namespace cv;
double myFunction(double a, double b) {
return a + b;
}
int main() {
double x = 1.0, y = 2.0;
double result = myFunction(x, y);
cout << "The result is: " << result << endl;
return 0;
}
以上代码中,在头文件opencv2/core.hpp
之后,我们定义了一个简单的自定义函数myFunction
,它接受两个double
类型的参数,将它们相加并返回和。我们在main
函数中使用两个变量x
和y
作为参数,调用该函数,并将结果打印到控制台上。
该程序输出The result is: 3
,这是自定义函数myFunction
计算1.0和2.0的和的结果。
使用这个示例程序作为模板,你可以定义自己的自定义函数,根据需要修改参数和返回值的类型和计算逻辑,然后在OpenCV中实现简单调用。