使用Opencv python查找灰度或彩色图像

时间:2015-11-04 07:41:16

标签: python opencv

我想自动化并滤除灰度&在openCV python的帮助下彩色图像。我试图在颜色上运行直方图。灰度图像,找到下面的结果

GrayScale Vs Color Image

尝试过的代码:

import cv2
import numpy as np
import sys
img = cv2.imread(sys.argv[1])
h = np.zeros((300,256,3))

bins = np.arange(256).reshape(256,1)
color = [ (255,0,0),(0,255,0),(0,0,255) ]
for ch, col in enumerate(color):
    hist_item = cv2.calcHist([img],[ch],None,[256],[0,256])
    cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX)
    hist=np.int32(np.around(hist_item))
    pts = np.column_stack((bins,hist))
    cv2.polylines(h,[pts],False,col)
h=np.flipud(h)
cv2.imshow('colorhist',h)
cv2.waitKey(0)

如果不为每个文件创建直方图,我可以自动完成相同的操作吗?

3 个答案:

答案 0 :(得分:1)

这是一个示例c ++代码,用于确定图像是彩色还是灰度。我认为你可以很容易地将它转换为python。

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "iostream"

using namespace cv;

bool isGrayImage( Mat img ) // returns true if the given 3 channel image is B = G = R
{
    Mat dst;
    Mat bgr[3];
    split( img, bgr );
    absdiff( bgr[0], bgr[1], dst );

    if(countNonZero( dst ))
        return false;

    absdiff( bgr[0], bgr[2], dst );
    return !countNonZero( dst );
}

int main(int argc, char** argv)
{
    static const char* str[] = {" is a COLOR image"," is a GRAY image"};
    char* filename = argc >= 2 ? argv[1] : (char*)"fruits.jpg";
    Mat src = imread(filename);

    if(src.data)
    {
        std::cout << filename << str[isGrayImage( src )] << std::endl;
        imshow(filename, src );
        waitKey();
    }
    return 0;
}

答案 1 :(得分:1)

扩展上面的通道比较,使用numpy数组切片并假设图像是RGB或HSV,如颜色空间:

def isbw(img):
    #img is a numpy.ndarray, loaded using cv2.imread
    if len(img.shape) > 2:
        looks_like_rgbbw = not False in ((img[:,:,0:1] == img[:,:,1:2]) == (img[:,:,1:2] ==  img[:,:,2:3]))
        looks_like_hsvbw = not (True in (img[:,:,0:1] > 0) or True in (img[:,:,1:2] > 0))
        return looks_like_rgbbw or looks_like_hsvbw
    else:
        return True

易于扩展以检查其他色彩空间条件。

未对“边缘/异常”情况(例如其他可能的格式)进行广泛测试。对于仅红色通道(BGR)图像将失败,因为这将看起来像黑白HSV图像,因此信任cv2 cvtColor转换为BGR格式可能更好,这取决于图像主体。其他“边缘”案例可能存在。

答案 2 :(得分:0)

您可以使用CV_LOAD_IMAGE_COLOR(1)标记(imread文档)将图像加载为颜色:

img = cv2.imread(sys.argv[1], 1)

然后检查图像是否具有与每个像素相同的红色,绿色,蓝色通道的像素值。

for x in range(0, width):
  for y in range(0, height):
    if img[x, y, 0] == img[x, y, 1] == img[x, y, 2]:
      # needs to be true for all pixels
    else:
      # not grayscale

使用CV_LOAD_IMAGE_ANYDEPTH标志加载图片时,您也可以尝试使用channels方法。