【问题标题】:How can I adjust contrast in OpenCV in C?如何在 C 中调整 OpenCV 中的对比度?
【发布时间】:2012-05-19 22:12:37
【问题描述】:

我只是想调整灰度图像中的对比度/亮度,以使用 C 语言中的 Opencv 突出显示该图像中的白色。我该怎么做?是否有任何函数可以在 opencv 中完成此任务?

原图:

修改后的图片:

提前致谢!

【问题讨论】:

  • 可以在opencv中调整它们。但如果你能添加一张图片,然后解释你想要什么,那会更有用。
  • @Abid Rahman K 图片已添加..
  • 第二张图片是您想要的结果吗?如果是这样,你是怎么做到的?在 Opencv 中也可以这样做
  • @Abid Rahman K 我已经完成了 Photoshop :) 。我只修正了对比度,但我想用 opencv 来做到这一点

标签: c opencv contrast


【解决方案1】:

我认为您可以通过两种方式在这里调整对比度:

1) Histogram Equalization :

但是当我用你的图片尝试这个时,结果并不像你预期的那样。在下面检查:

2) 阈值

在这里,我将输入的每个像素值与任意值(我采用127)进行了比较。以下是在 opencv 中具有内置功能的逻辑。 But remember, output is Binary image, not grayscale as you did.

If (input pixel value >= 127):
    ouput pixel value = 255
else:
    output pixel value = 0

下面是我得到的结果:

为此,您可以使用 Threshold functioncompare function

3) 如果你必须得到灰度图像作为输出,请执行以下操作

(代码在 OpenCV-Python 中,但是对于每个函数,对应的 C 函数在 opencv.itsezez.com 中可用)

for each pixel in image:
   if pixel value >= 127: add 'x' to pixel value.
   else : subtract 'x' from pixel value. 

('x' 是一个任意值。)因此明暗像素之间的差异会增加。

img = cv2.imread('brain.jpg',0)

bigmask = cv2.compare(img,np.uint8([127]),cv2.CMP_GE)
smallmask = cv2.bitwise_not(bigmask)

x = np.uint8([90])
big = cv2.add(img,x,mask = bigmask)
small = cv2.subtract(img,x,mask = smallmask)
res = cv2.add(big,small)

下面是得到的结果:

【讨论】:

  • 这些都不能解决问题,即如何调整对比度
  • 问题标题确实是“如何调整对比度”。但他想要做的是突出图像中的白色部分。所以我用我所拥有的任何知识来回答这个问题。当然,在评论中,OP 告诉他一种方法对他来说是完美的。所以我认为它解决了问题。仅考虑标题,您可能是对的。 :)
  • 我们应该改变 OP 的问题以避免导致这种情况的搜索。
  • @MaxJaderberg 直方图均衡是对比度增强的一种形式,但阈值化只是创建二值图像,即调整亮度。所以这个答案肯定回答了 OP 的问题,也许不是标题,但实际问题本身在这里得到了回答
【解决方案2】:

您还可以查看 OpenCV CLAHE 算法。它不是全局均衡直方图,而是将图像分割成图块并在局部均衡它们,然后将它们拼接在一起。这可以提供更好的结果。

在 OpenCV 3.0.0 中使用您的图像:

import cv2
inp = cv2.imread('inp.jpg',0)
clahe = cv2.createCLAHE(clipLimit=4.0, tileGridSize=(8,8))
res = clahe.apply(inp)
cv2.imwrite('res.jpg', res)

给了一些很好的东西

在这里阅读更多关于它的信息,虽然它不是很有帮助: http://docs.opencv.org/3.1.0/d5/daf/tutorial_py_histogram_equalization.html#gsc.tab=0

【讨论】:

    【解决方案3】:

    虽然这篇文章有点陈旧: 使用“cvAddWeighted()”怎么样?

    它的作用是:

                 dst = src1*alpha + src2*beta + gamma
    

    我从应用亮度和对比度的理解是,一个人想做的事:

                 dst = src*contrast + brightness;
    

    如果

                 src1  = input image
                 src2  = any image of same type as src1
                 alpha = contrast value
                 beta  = 0.0
                 gamma = brightness value
                 dst   = resulting Image (must be of same type as src1)
    

    这个任务应该差不多完成了吧?

    这个方法适用于我使用 CvMat* 图像

    【讨论】:

    • 在 C 中提出了问题
    • C: void cvAddWeighted(const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst)...不要混淆:C++ addWeighted()
    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2022-11-30
    相关资源
    最近更新 更多