asatmda

图像RGB值、灰度值、像素值的关系
实际上在我们的日常生活中,通过三原色色彩深浅的组合,可以组成各种不同的颜色。产品能够展现的灰度数量越多,也就意味着...
扫描右侧二维码阅读全文
25
2019/11

图像RGB值、灰度值、像素值的关系

huidutu.jpg

实际上在我们的日常生活中,通过三原色色彩深浅的组合,可以组成各种不同的颜色。产品能够展现的灰度数量越多,也就意味着这款产品的色彩表现力更加丰富,能够实现更强的色彩层次。例如三原色16级灰度,能显示的颜色就是16×16×16=4096色。不过目前的产品256级灰度已经非常地普遍了。

 所谓颜色或灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真。灰度级取决于每个像素对应的刷新存储单元的位数和显示器本身的性能。如每个象素的颜色用16位二进制数表示,我们就叫它16位图,它可以表达2的16次方即65536种颜色。如每一个象素采用24位二进制数表示,我们就叫它24位图,它可以表达2的24次方即16777216种颜色。

灰度就是没有色彩,RGB色彩分量全部相等。如果是一个二值灰度图象,它的象素值只能为0或1,我们说它的灰度级为2。用个例子来说明吧:一个256级灰度的图象,RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。

灰度是指黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像,在医学、图像识别领域有很广泛的用途

彩色图象的灰度其实在转化为黑白图像后的像素值(是一种广义的提法),转化的方法看应用的领域而定,一般按加权的方法转换,R , G ,B 的比一般为3:6:1。

任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:

1.浮点算法:Gray=R*0.3+G*0.59+B*0.11

2.整数方法:Gray=(R*30+G*59+B*11)/100

3.移位方法:Gray =(R*28+G*151+B*77)>>8;

4.平均值法:Gray=(R+G+B)/3;

 5.仅取绿色:Gray=G;

通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。
灰度值与像素值的关系
记录了明亮(暗与亮,黑与白)度信息的2D图像成为亮度(灰度)图像。如果对于一张本身就是灰度图像(8位灰度图像)来说,他的像素值就是它的灰度值,如果是一张彩色图像,则它的灰度值需要经过函数映射来得到。灰度图像是由纯黑和纯白来过渡得到的,在黑色中加入白色就得到灰色,纯黑和纯白按不同的比例来混合就得到不同的灰度值。

像素中具有RGB三通道的彩色图像来说怎样才能得到灰度图像呢?只要使R=G=B,三者的值相等就可以得到灰度图像。R=G=B=255为白色,R=G=B=0为黑色,R=G=B=小于255的某个整数时,此时就为某个灰度值。

#demo
#time:2019/11/27
import cv2
import os
import face_recognition
from PIL import Image, ImageDraw
from PyFaceDet import facedetectcnn
from threading import Timer
import matplotlib.image as mp

# 设置摄像头参数

cap = cv2.VideoCapture(1)
cap.set(cv2.CAP_PROP_FPS, 100)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))
# 全局自动调阈值
tole = [0.5, 0.48, 0.45, 0.43, 0.42, 0.4, 0.38, 0.35]
tj = 0
#图像分割保存函数
def save_face(imgaa):
    # Load the jpg file into a numpy array
    image = face_recognition.load_image_file(imgaa, 'RGB')
    face_locations = face_recognition.face_locations(image)
    flag_image = 1
    for face_location in face_locations:
        # 打印每张脸的位置
        top, right, bottom, left = face_location
        # print("人脸位于像素位置顶部: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))
        # You can access the actual face itself like this:
        face_image = image[top:bottom, left:right]
        pil_image = Image.fromarray(face_image)
        mp.imsave("save\\" + str(flag_image) + ".jpg", face_image)
        flag_image = flag_image + 1


#RGB转换函数同时转为16进制颜色字符
def rgb_to_hex(imgaa):
    img = Image.open(imgaa)
    search_image = img.getcolors(img.size[0] * img.size[1])
    max_num = search_image[0]
    for i in search_image:
        if (i[0] > max_num[0]):
            max_num = i
    strs = ''
    for i in max_num[1]:
        num = int(i)  # 将str转int
        # 将R、G、B分别转化为16进制拼接转换并大写
        strs += str(hex(num))[-2:].replace('x', '0').upper()
    return strs

# 肤色排序
def skin_sorts(im_ip):
    save_face(im_ip)
    arr = {}
    for i in range(1, 7):
        imgaa = 'save/' + str(i) + '.jpg'
        arr[i] = rgb_to_hex(imgaa)

    list1 = sorted(arr.items(), key=lambda x: x[1])
    print(list1)


#图像处理阶段(目标人脸识别和)
# 目标人脸判断
def image_judge(known_image, unknown_image, flag):
    # 获取目标人面部编码
    global tole
    global tj
    known_image = face_recognition.load_image_file(known_image)
    unknown_image = face_recognition.load_image_file(unknown_image)

    # 返回一个待测人群的面部编码
    obama_encoding = face_recognition.face_encodings(known_image)[0]
    unknown_encoding1 = face_recognition.face_encodings(unknown_image)
    # print(unknown_encoding1)
    #
    # for i in range(len(unknown_encoding1)):
    # 返回的是一个True或者一个False的列表
    if face_recognition.compare_faces([obama_encoding], unknown_encoding1[flag], tolerance=tole[tj])[0]:  # 判断  tolerance值越小越精确
        return True
    else:
        return False
    
    
#特征处理(画嘴巴)
def image_mouth(image_mouth_ip):
    image = face_recognition.load_image_file(image_mouth_ip)
    # 找出图片中所有人脸的面部特征
    face_landmarks_list = face_recognition.face_landmarks(image)#返回字典
    arr=face_landmarks_list[0]

    # 创建一个PIL ImageDraw对象,后面用于图像绘制
    pil_image = Image.fromarray(image)
    d = ImageDraw.Draw(pil_image)
    for i in face_landmarks_list:
        #print(i.keys())
        for facial_feature in i.keys():
            if facial_feature == 'top_lip' or facial_feature=='bottom_lip':
                d.line(i[facial_feature], width=10)
    pil_image.show()
    mp.imsave("image\\end_image\\"+'thnu_jqr_end'+".jpg",pil_image)

# 分别表示目标人脸和未知人脸参数(处理人脸,找到目标人脸以后对目标框画紫色,非目标人画蓝色)
#找出目标人后保存
def image_handle(known_image, image_ip):
    global tole
    global tj
    image = face_recognition.load_image_file(image_ip)
    face_locations = face_recognition.face_locations(image)
    faceNum = len(face_locations)
    print("人脸个数是:", faceNum)
    # 读取原图,准备做标志
    pil_image = Image.fromarray(image)
    arr = []
    mubiao = 0
    flag_image = 1
    for i in range(0, faceNum):
        # 面部区域的四个坐标
        top = face_locations[i][0]
        right = face_locations[i][1]
        bottom = face_locations[i][2]
        left = face_locations[i][3]
        face_image = image[top:bottom, left:right]
        #对人脸进行切割,编号保存,肤色处理阶段
        #图像切割保存
       # mp.imsave("save\\" + str(flag_image) + ".jpg", face_image)
            
        # 画图
        if image_judge(known_image, image_ip, i):
            d = ImageDraw.Draw(pil_image, 'RGBA')
            d.rectangle((left, top, right, bottom), outline="#A00DAB")  # 目标人物用紫色圈出来
            arr.append(i)
            mubiao = mubiao + 1
        else:
            d = ImageDraw.Draw(pil_image, 'RGBA')
            d.rectangle((left, top, right, bottom), outline="#0DABA0")  # 非目标人物则用蓝色圈出来
        #cv2.putText(d, str(flag_image), (top, right), font, 2, (0, 250, 0))
        #cv2.putText(face_image, str(flag_image), ((left + right) // 2, (top + bottom) // 2), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (133, 255, 133), 2)
        flag_image = flag_image + 1
    #阈值
    while True:
        print(mubiao, tole[tj])
        if len(arr) > 1:
            tj = tj + 1
            for i in arr:
                # 面部区域的四个坐标
                top = face_locations[i][0]
                right = face_locations[i][1]
                bottom = face_locations[i][2]
                left = face_locations[i][3]
                # 画图
                if image_judge(known_image, image_ip, i):
                    d = ImageDraw.Draw(pil_image, 'RGBA')
                    d.rectangle((left, top, right, bottom), outline="#A00DAB")  # 目标人物用紫色圈出来
                else:
                    d = ImageDraw.Draw(pil_image, 'RGBA')
                    d.rectangle((left, top, right, bottom), outline="#0DABA0")  # 非目标人物则用蓝色圈出来
                    arr.remove(i)
                    mubiao = mubiao - 1
        elif len(arr) < 1:
            tj = tj - 1
            for i in range(0, faceNum):
                # 面部区域的四个坐标
                top = face_locations[i][0]
                right = face_locations[i][1]
                bottom = face_locations[i][2]
                left = face_locations[i][3]
                # 画图
                if image_judge(known_image, image_ip, i):
                    d = ImageDraw.Draw(pil_image, 'RGBA')
                    d.rectangle((left, top, right, bottom), outline="#A00DAB")  # 目标人物用紫色圈出来
                    arr.append(i)
                    mubiao = mubiao + 1
                else:
                    d = ImageDraw.Draw(pil_image, 'RGBA')
                    d.rectangle((left, top, right, bottom), outline="#0DABA0")  # 非目标人物则用蓝色圈出来
        else:
            break

    # 显示标志后的图片
    pil_image.show()

# 处理图片PyFaceDet(对图像进行采集,当识别到全部人脸以后就进行拍照)
def PyFace_image(image_path, close_win):
    img = cv2.imread(image_path)
    Faces = facedetectcnn.facedetect_cnn(image_path)
    #flag_image = 1
    for i in range(len(Faces)):
        x = Faces[i][0]
        y = Faces[i][1]
        L = Faces[i][2]
        W = Faces[i][3]
        confidence = Faces[i][4]
        angle = Faces[i][5]
        #保存一次图像,并且对图像进行切割,肤色排序等操作
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.rectangle(img, (x, y), (x + L, y + W), (34, 139, 34), 2)  # 图片,左上角坐标,右下角坐标,画线对应RGB
        roi_color = img[y:y + W, x:x + L]
        cv2.imwrite("save\\" + str(i) + ".jpg", roi_color)
        cv2.putText(img, str(i), (x + 5, y - 5), font, 1, (0, 0, 255), 1)  # 图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        cv2.imshow('camera', img)
        if i == 1:  # 人脸个数控制
            cv2.imwrite("image\\end_image\\"+ '666_thnu_jqr_'+ ".jpg",img)#保存最终图像,直接在保存的图像上编号
            return True
        k = cv2.waitKey(close_win)  # 等待close_win毫秒后关闭显示的窗口

#存图片函数
def write_image(start_id, times):
    while (1):
        ret, frame = cap.read()
        cv2.imshow('capture', frame)
        if (start_id % times == 0):
            # 每隔times帧处理一张
            cv2.imwrite("image\\" + str(1) + ".jpg", frame)
            # 如果找到六个人就保存
            if PyFace_image('image\\1.jpg', 100):
                print("我找到全部人脸了,我要开始保存了!!!")
                # 保存已经找到的六张人脸
                cv2.imwrite("image\\ok\\" + "thnu_jqr_" + ".jpg", frame)
                #######################################################
                # 图像处理阶段
                #1.判断是否为目标人,对目标人用紫色框选,其他人用蓝色框选
                image_handle('image\\bass\\10.jpg',"image\\ok\\thnu_jqr_.jpg")
                #2.框选嘴巴(特征处理)
                image_mouth('image/end_image/666_thnu_jqr_.jpg')
                # 对图像进行切割
                # save_face('test1/thnu_jqr_.jpg')
                # 肤色检测
                # skin_sorts('test1/thnu_jqr_.jpg')
                # 开始执行函数进行图像处理
                # image_handle('test/apy.png','test1/thnu_jqr_.jpg')
                print("图像存起来了!!!")
            # cv2.imwrite("test1\\"+ str(start_id) + ".jpg",frame)
        start_id = start_id + 1
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break


cv2.destroyAllWindows()
#主函数调用
if __name__ == "__main__":
    #这里是调用的内容
    write_image(1,120)
def get_face_from_photo(i,path,spath):
    '''
    利用别人写好的人脸分类器来截取图片中的人脸,并保存到spath中
    分类器下载:https://github.com/opencv/opencv/tree/master/data/haarcascades
    参考:官方文档
    '''
    detector = dlib.get_frontal_face_detector() #获取人脸分类
    # 读取path路径下的图片,获得所有的图片名字
    filenames = os.listdir(path)
    print(filenames)

    for f1 in filenames:
        f = os.path.join(path,f1)
        iimag = PIL.Image.open(f)
        # opencv 读取图片,并显示
        img = cv2.imread(f, cv2.IMREAD_COLOR)

        b, g, r = cv2.split(img)    # 分离三个颜色通道
        img2 = cv2.merge([r, g, b])   # 生成新图片

        counts = detector(img, 1) #人脸检测

        for index, face in enumerate(counts):

            # 在图片中标注人脸,并显示
            left = face.left()
            top = face.top()
            right = face.right()
            bottom = face.bottom()

            #保存人脸区域
            j =str(i)
            j = j+'.jpg'
            save_path = os.path.join(spath,j)
            region = (left,top,right,bottom)
            #裁切图片
            cropImg = iimag.crop(region)

            #保存裁切后的图片
            cropImg.save(save_path)
            i +=1

            cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)
            cv2.namedWindow(f, cv2.WINDOW_AUTOSIZE)
            cv2.imshow(f, img)

    # 等待按键,退出,销毁窗口
    k = cv2.waitKey(0)
    cv2.destroyAllWindows()
    return i
Last modification:November 28th, 2019 at 09:20 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment