我想自动化并滤除灰度&在openCV python的帮助下彩色图像。我试图在颜色上运行直方图。灰度图像,找到下面的结果
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)
如果不为每个文件创建直方图,我可以自动完成相同的操作吗?
答案 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方法。