Python图像纹理分割

举报
振华OPPO 发表于 2021/12/31 14:44:32 2021/12/31
【摘要】 1️⃣作业要求将下图左右两种不同类型的纹理区域分开,方法输出结果是一幅与该图像等大小的二值图像,左边为0,右边为1,或者相反,灰色边框线在设计的方法中不作考虑,自行去除。2️⃣实现源码import matplotlib.image as mpimgimport matplotlib.pyplot as pltimport numpy as npfrom cv2 import cv2from ...
1️⃣作业要求

将下图左右两种不同类型的纹理区域分开,方法输出结果是一幅与该图像等大小的二值图像,左边为0,右边为1,或者相反,灰色边框线在设计的方法中不作考虑,自行去除。
在这里插入图片描述

2️⃣实现源码
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
from cv2 import cv2
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVR
from skimage import feature as skft
from PIL import Image,ImageDraw,ImageFont

class Texture():
   #n_point选取中心像素周围的像素点的个数
   #radius选取的区域的半径
    def __init__(self):
        self.radius = 1
        self.n_point = self.radius * 8
    #加载灰度图片
    def loadPicture(self):
        train_index = 0
        test_index = 0
        train_data = np.zeros((10, 171, 171))
        test_data = np.zeros((8, 171, 171))
        train_label = np.zeros(10)
        test_label = np.zeros(8)
        for i in np.arange(2):
            image = mpimg.imread('dataset1/'+str(i)+'.tiff')
            data = np.zeros((513, 513))
            data[0:image.shape[0], 0:image.shape[1]] = image
            index = 0
            #图片分成9块,5块训练4块预测
            for row in np.arange(3):
                for col in np.arange(3):
                    if index < 5:
                      train_data[train_index, :, :] = data[171*row:171*(row+1),171*col:171*(col+1)]
                      train_label[train_index] = i
                      train_index += 1
                    else:
                      test_data[test_index, :, :] = data[171*row:171*(row+1),171*col:171*(col+1)]
                      test_label[test_index] = i
                      test_index += 1
                    index += 1

        return train_data, test_data, train_label, test_label
    #纹理检测
    def texture_detect(self):
        train_data, test_data, train_label, test_label = self.loadPicture()
        n_point = self.n_point
        radius = self.radius
        train_hist = np.zeros((10, 256))
        test_hist = np.zeros((8, 256))
        #LBP特征提取
        for i in np.arange(10):
            # 使用LBP方法提取图像的纹理特征.
            lbp=skft.local_binary_pattern(train_data[i], n_point, radius, 'default')
            # 统计图像的直方图
            max_bins = int(lbp.max() + 1)
            # hist size:256
            train_hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins))

        for i in np.arange(8):
            lbp = skft.local_binary_pattern(test_data[i], n_point, radius, 'default')
            max_bins = int(lbp.max() + 1)
            # hist size:256
            test_hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins))

        return train_hist, test_hist
    #训练分类器 SVM支持向量机分类
    def classifer(self):
        train_data, test_data, train_label, test_label = self.loadPicture()
        train_hist, test_hist = self.texture_detect()
        #构建SVM支持向量机
        svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
        model= OneVsRestClassifier(svr_rbf, -1)
        model.fit(train_hist, train_label)

        image=cv2.imread('dataset1/image.png',cv2.IMREAD_GRAYSCALE)
        image=cv2.resize(image,(588,294))
        img_ku=skft.local_binary_pattern(image,8,1,'default')
        thresh=cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
        #对图像进行识别分类
        img_data=np.zeros((1,98,98))
        data=np.zeros((294,588))
        data[0:image.shape[0],0:image.shape[1]]=image
        img = Image.open('texture.png')
        draw = ImageDraw.Draw(img)
        # 设置字体和大小
        myfont = ImageFont.truetype('C:/windows/fonts/Arial.ttf', size=180)
        # 设置字体颜色
        fillcolor = "#008B8B"
        # 读取图片的size,也就是宽度和高度
        width, height = img.size

        #通过行列将图像分为九块
        for row in np.arange(3):
            for col in np.arange(6):
                img_data[0,:,:]=data[98*row:98*(row+1),98*col:98*(col+1)]
                lbp= skft.local_binary_pattern(img_data[0], 8, 1, 'default')
                max_bins=int(lbp.max()+1)
                img_hist, _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins))
                predict=model.predict(img_hist.reshape(1,-1))
                if(predict==0):
                    draw.text((width/6, height/6), '0', font=myfont, fill=fillcolor)
                    data[98*row:98*(row+1),98*col:98*(col+1)]=0
                else:
                    draw.text((2*width /3, height/6), '1', font=myfont, fill=fillcolor)
                    data[98*row:98*(row+1),98*col:98*(col+1)]=255
        plt.subplot(211)
        plt.imshow(img_ku,'gray')
        #plt.subplot(312)
        #plt.imshow(thresh,'gray')
        plt.subplot(212)
        plt.imshow(img)
        plt.show()



if __name__ == '__main__':
      test = Texture()
      # 计算分类准确度部分
      accuracy = test.classifer()
      #print('Final Accuracy = '+str(accuracy)+'%')
3️⃣实验结果

上面一张图是结果LBP算子特征提取后的图片,下面一张图使用SVM进行纹理分类后得到的结果,与预测的左上图纹理相同标为0,与右上图相同标为1。
在这里插入图片描述

⭐实验源码+报告⭐
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。