【Python/OpenCV】Color extraction processing, folder processing, csv output

Programming

1. Summary

I would like to introduce the method of extracting the red line drawn in the following image by image processing using Python and OpenCV.
Furthermore, I would like to introduce how to output the extracted red line coordinate values ​​to a CSV file and how to perform folder processing that processes multiple images in succession.

2. Environment

  • OS : Windows10 64bit
  • OpenCV :4.1.0
    Please refere this link to see how to install python-opencv.
  • IDE : Spyder

3. Image Processing

Let’s see the python code!

#import libraries
import numpy as np
from matplotlib import pyplot as plt
import os
import skimage
from skimage import io
from tqdm import tqdm
import glob
import cv2
import csv

#Specify the image file directory to be input and the output destination directory
#process the images in "root folder" - "data folder" - "image folder"
#output into "root folder" - "data folder" - "result folder"
#"root folder" stands for the folder you save the ".py" file in.
path="data/"
input_dir="image"
output_dir="result"

#make full path
all_files=glob.glob(os.path.join(path,input_dir,"**/*.*"),recursive=True)

#create csv file
csvfile = open("np_csv_test.csv", "w")

#loop processing
for i,filepath in tqdm(enumerate(all_files)):

    #read image with OpenCV
    src = cv2.imread(filepath)

    #Define the red color in RGB
    #lower = (0, 0, 200)
    #upper = (50, 50, 255)
    #Note, channel in OpenCV is BGR. And lower, upper threshold needs to be define from Blue, Green, Red respectively.
    #You can change these value if you want to.
    dst = cv2.inRange(src, (0, 0, 200), (50, 50, 255))

     #extract imagefilename.bmp from finename
    filename = filepath.rsplit("\\")[1]
    #Make full path
    outputimage = path + output_dir +"/" + "Extracted_redline_" + filename
    cv2.imwrite(outputimage, dst)

    #Extract (x,y) coordinate (value) from RED lines.
    #Note, in this script, np.where() is used.
    #Merge X and Y with np.dstack() method because the return from np.where() is separated. 
    #indices = np.dstack(np.where(dst == 255)) #This is going to be an error, I don't know why.
    indices = np.where(dst == 255) #Return values are Y,X in sequence. Be careful if you want to make an graph in EXCEL.

    outputcsv = path + output_dir +"/" + "result.csv";

    #Note, eveytime you execute, csv file will be overwritten.
    y = indices[0]
    y1 = y.reshape(1, y.size)
    x = indices[1]
    x1 = x.reshape(1, x.size)
    axis = np.arange(x.size)
    axis = axis.reshape(1, axis.size)
    with open(outputcsv, 'ab') as f:
        np.savetxt(f, filepath.rsplit("\\"), fmt="%s", delimiter = ",")
        np.savetxt(f, axis, fmt="%.0d", delimiter = ",")
        np.savetxt(f, x1, fmt="%.0d", delimiter = ",")
        np.savetxt(f, y1, fmt="%.0d", delimiter = ",")

#Close csv file
csvfile.close()

4. Result

4.1 Input images

A heart, star, pentagon-shaped with red line will be processed.

4.2 Extracted result

The red line on the heart, star, pentagon-shaped is extracted.

4.3 Exported result

Graph in EXCEL is made.
The coordinates (X, Y) of each pixel that forms the line are output, so it is the same as the image.

コメント

タイトルとURLをコピーしました