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()  # 返回均值和方差

参考资料:

视频链接

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务