OpenCV之基本的像素操作(Python实现)
对图像的处理,一般是对图像的numpy进行操作,即每个像素点。
这里设计的操作有and,or,not
还有+-*/
,我们这里得提前知道,像素点越大,那么颜色越亮,0代表黑色,255代表白色。
首先我们看四大基本操作。+-*/
def add_op(src1, src2): dst = cv.add(src1,src2) cv.imshow("add_op", dst) def sub_op(src1, src2): dst = cv.subtract(src1, src2) cv.imshow("sub_op", dst) def mul_op(src1, src2): dst = cv.multiply(src1, src2) cv.imshow("multipy_op", dst) def div_op(src1, src2): dst = cv.divide(src1, src2) cv.imshow("divide_op", dst)
+操作
这里我们分析为什么会出现这种情况,因为黑色为0,所有最右边的图黑色部分还是会保留原貌,但是白色部分为255,所以相加以后还是会保留为255,为白色。
-操作
和上面分析一样
*操作
/操作
按位的与或非
代码:
def bitwise_and(src1, src2): dst = cv.bitwise_and(src1, src2) cv.imshow("bitwise_and", dst) def bitwise_or(src1, src2): dst = cv.bitwise_or(src1, src2) cv.imshow("bitwise_or", dst) def bitwise_not(src1): dst = cv.bitwise_not(src1) cv.imshow("bitwise_not", dst)
按位与&
首先我们分析结果,按位&,那么为白色的地方,按位&以后,会保留另外一张图片的颜色,黑色地方还是继续为黑色。
我们看结果:
按位或|
首先想想安慰|,那么为白色的地方,肯定继续为白色,为黑色的地方,那么为另一张图片的内容。
按位非 not
最后的图像增强部分。
首先我们看具体的函数。
def contrast_brightness_demo(image, c, b): h, w, ch = image.shape[:] blank = np.zeros([h, w, ch], image.dtype) print(image[0, :5, 0]) dst = cv.addWeighted(image, c, blank, 1-c, b) print(dst[0, :5, 0]) cv.imshow("contrast_brightness_demo", dst)
我们看cv.addWeighted()
我们看它的具体参数
def addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None): # real signature unknown; restored from __doc__ """ addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst . @brief Calculates the weighted sum of two arrays. . . The function addWeighted calculates the weighted sum of two arrays as follows: . \f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I)* \texttt{alpha} + \texttt{src2} (I)* \texttt{beta} + \texttt{gamma} )\f] . where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each . channel is processed independently. . The function can be replaced with a matrix expression: . @code{.cpp} . dst = src1*alpha + src2*beta + gamma; . @endcode . @note Saturation is not applied when the output array has the depth CV_32S. You may even get . result of an incorrect sign in the case of overflow. . @param src1 first input array. . @param alpha weight of the first array elements. . @param src2 second input array of the same size and channel number as src1. . @param beta weight of the second array elements. . @param gamma scalar added to each sum. . @param dst output array that has the same size and number of channels as the input arrays. . @param dtype optional depth of the output array; when both input arrays have the same depth, dtype . can be set to -1, which will be equivalent to src1.depth(). . @sa add, subtract, scaleAdd, Mat::convertTo """ pass
dst = src1*alpha + src2*beta + gamma;
具体的就是看这个公式,但是这是一个矢量式。
我们看看最后的效果
图像的均值和方差
def others(m1, m2): M1 = cv.mean(m1) M2 = cv.mean(m2) print(M1) print(M2) mean1, dev1 = cv.meanStdDev(m1) print("图像m1的均值: %s, 方差为: %s" % (mean1, dev1))
所以熟悉两个函数
cv.mean() #返回均值 cv.meanStdDev() # 返回均值和方差
参考资料: